2009-08-27 11 views
13

Sto costruendo un sito in cui gli utenti registrati possono caricare i file. Questi file vengono quindi serviti tramite Apache. Solo gli utenti che hanno effettuato l'accesso dovrebbero poter accedere a tali file.Accesso ai supporti statici protetti in un sito Django

Ho letto this page ma sembra che le persone debbano effettuare il login due volte per accedere sia al sito che al supporto, ogni volta utilizzando un diverso tipo di casella di accesso.

C'è un modo per aggirare questo o c'è un altro modo per limitare l'accesso al supporto statico servito da Apache utilizzando il database di autenticazione Django?

Sto usando mod_python.

EDIT: Come ho finito per la soluzione di questo dopo aver letto la risposta di Van Gale e this:

  1. commutato WSGI.
  2. installati mod_xsendfile
  3. Mossi tutti i file multimediali pubblico in una sottocartella in/media/pubbliche
  4. Aggiunto l'accesso alla cartella pubblica utilizzando un alias/media//var/www.../media/public pubblico
  5. WSGIScriptAlias ​​aggiunti/media/protetto//var/www.../apache/django.wsgi (stesso gestore come per il resto del sito)
  6. Aggiunto XSendFile On e On XSendFileAllowAbove
  7. per il Django app ho aggiunto un urlconf per/media/protected che fa fondamentalmente cosa è here, modificato solo per la mia auth sistema di accesso. Gestisce gli URL come/media/protected/GROUP_ID/file in modo che solo i membri del gruppo possano scaricare i file.
+0

L'altro problema con l'approccio descritto nei documenti di Django è che sembra utilizzare l'autenticazione di base - questo invia le password in cleartext con codifica base64, quindi non è sicuro a meno che non si usi anche SSL per tutte le richieste. –

risposta

10

Il modo usuale per fare ciò è di passare un'intestazione speciale al server web.

È possibile farlo con nginx utilizzando x-accel-redirect come in questo Django snippet.

Per Apache, dovrebbe essere abbastanza simile utilizzando il modulo mod_xsendfile (discussion and examples sulla mailing list degli utenti di Django).

+0

Ho intenzione di provare a mod_xsendfile. –

+0

Ha funzionato! Dovevo passare a WSGI, ma non era così difficile come pensavo. –

+0

In mod_wsgi 3.0, è possibile restituire una posizione con 200 stato. Le directory devono essere mappate tramite un URL, che viene quindi referenziato in Location.Poiché è richiesta la mappatura degli URL, per garantire che i client remoti non possano raggiungerli, è necessario utilizzare una regola mod_rewrite per renderli proibiti se non una richiesta secondaria Apache. L'altra opzione consiste nell'utilizzare l'estensione wsgi.file_wrapper per restituire in modo ottimale il file direttamente da Django. Al momento non è possibile farlo con Django, ma sarà consentito nella versione futura. –

2

Se avete la libertà di passare da Apache a lighttpd, allora la soluzione più semplice sarebbe quella di utilizzare mod_secdownload che fare esattamente ciò che si vuole, cioè, fornire l'autenticazione applicazione mentre serve i file effettivi tramite server web.

Tuttavia se si è bloccati con Apache, quindi suggerisco mod_auth_token, qui si parla di PHP, ma è possibile generare il token in Python o in qualsiasi altra lingua. Utilizzando mod_auth_token sarai in grado di generare il token nella tua applicazione, e poi fare in modo che il server web serva il file statico che utilizza quel token.

Problemi correlati