2009-08-27 8 views
13

Ich erstelle eine Website, auf der registrierte Benutzer Dateien hochladen können. Diese Dateien werden dann über Apache geliefert. Nur angemeldete Benutzer sollten auf diese Dateien zugreifen können.Sicherer Zugriff auf statische Medien in einer Django-Site

Ich habe this page gelesen, aber es scheint, dass die Leute sich zweimal anmelden müssen, um sowohl auf die Site als auch auf das Medium zugreifen zu können, wobei sie jedes Mal eine andere Art von Login-Box verwenden.

Gibt es einen Weg dazu oder gibt es eine andere Möglichkeit, den Zugriff auf statische Medien einzuschränken, die von Apache mit Hilfe der Django-Authentifizierungsdatenbank bedient werden?

Ich benutze mod_python.

EDIT: Wie kann ich diese Lösung endete nach Van Gale Antwort zu lesen und this:

  1. zu WSGI Switched.
  2. mod_xsendfile installiert
  3. Verschoben alle öffentlichen Mediendateien in einem Unterordner in/media/public
  4. Added Zugang zum öffentlichen Ordner ein Alias ​​/ Medien/Öffentlichkeit /var/www.../media/public mit
  5. Hinzugefügt WSGIScriptAlias ​​/ media/protected//var/www.../apache/django.wsgi (gleiche Behandlungsroutine wie für den Rest der Seite)
  6. Added XSendFile Auf und XSendFileAllowAbove Auf
  7. zum Django app ich hinzugefügt eine urlconf für/media/protected was im Grunde was ist here, nur für meine auth Einreichungssystem. Es behandelt URLs wie/media/protected/GROUP_ID/file, so dass nur Mitglieder der GROUP die Dateien herunterladen können.
+0

Das andere mögliche Problem mit dem in den Django-Dokumenten beschriebenen Ansatz ist, dass es die grundlegende Authentifizierung zu verwenden scheint - das sendet Passwörter in Base64-codiertem Klartext, ist also nicht sicher, es sei denn, Sie verwenden auch SSL für alle Anfragen. –

Antwort

10

Der übliche Weg, dies zu tun, besteht darin, einen speziellen Header an den Webserver zurückzugeben.

Sie können es mit nginx mit x-accel-redirect wie in diesem Django snippet tun.

Für Apache sollte es ziemlich ähnlich sein mit dem mod_xsendfile Modul (discussion and examples auf Django Benutzer Mailing-Liste).

+0

Ich werde mod_xsendfile versuchen. –

+0

Es hat funktioniert! Musste zu WSGI wechseln, aber das war nicht so schwer wie ich dachte. –

+0

In mod_wsgi 3.0 können Sie einen Standort mit 200 Status zurückgeben. Die Verzeichnisse müssen jedoch über eine URL zugeordnet werden, auf die dann unter Standort verwiesen wird.Da die URL-Zuordnung erforderlich ist, um sicherzustellen, dass Remote-Clients nicht zu ihnen gelangen, müssen Sie eine Regel mod_rewrite verwenden, um sie zu einer verbotenen Apache-Unteranfrage zu machen. Die andere Möglichkeit besteht darin, die Erweiterung wsgi.file_wrapper zu verwenden, um die Datei direkt von Django aus zurückzusenden. Im Moment kann dies nicht mit Django gemacht werden, wird aber in zukünftigen Versionen erlaubt sein. –

2

Wenn Sie die Freiheit von Apache zu lighttpd wechseln müssen, dann wäre die einfachste Lösung zu verwenden mod_secdownload sein, das würde genau das tun, was Sie wollen, das heißt, Anwendungsauthentifizierung bereitzustellen, während die eigentlichen Dateien über Web-Server dient.

Wenn Sie jedoch mit Apache stecken, dann empfehle ich mod_auth_token, hier erwähnen sie PHP, aber Sie können das Token in Python oder einer anderen Sprache generieren. Mithilfe von mod_auth_token können Sie das Token in Ihrer Anwendung generieren und anschließend die statische Datei mithilfe dieses Servers vom Webserver bereitstellen lassen.

Verwandte Themen