2012-03-21 23 views
6

Sto costruendo un sistema che consente agli utenti di generare un documento e quindi scaricarlo. I documenti sono PDF (non che sia importante per questa domanda) e quando vengono generati li memorizzo sul mio file system locale su cui è in esecuzione il server web con nomi di file uuidLimitazione dell'accesso ai file statici in Django/Nginx

c7d43358-7532-4812- b828-b10b26694f0f.pdf

ma so "security through obscurity" non è la soluzione giusta ...

voglio limitare l'accesso ai loro file su una base per account, se possibile. Una cosa che penso di poter fare è caricarli su S3 e fornire un URL firmato, ma voglio evitarlo per ora, se possibile.

Sto usando Nginx/Django/Gunicorn/CE2/S3

Quali sono le altre soluzioni?

risposta

3

Che ne dici di imporre user==owner a livello di vista, impedendo l'accesso ai file, archiviandoli come FileFields e recuperando il file solo se tale condizione viene soddisfatta.

ad es. Puoi usare @login_requireddecorator nella vista per consentire l'accesso solo se loggato. Questo può essere raffinato usando request.user per verificare contro il proprietario del file. La sezione Autenticazione utente di Django documentation è probabilmente utile qui.

L'altra opzione, come si menziona è tramite S3 stesso, la generazione di URL all'interno di Django che hanno una query querystring che consente a un utente autenticato l'accesso per scaricare un particolare oggetto s3 con un limite di tempo. Dettagli su quello possono essere trovati al s3 documentation. Una domanda simile è stata posta prima del here su SO.

1

Ho utilizzato django-private-files con grande successo, applica la protezione a livello di vista e utilizza backend diversi per eseguire il trasferimento di file effettivo.

10

Se si stanno servendo file di piccole dimensioni, è possibile utilizzare Django per servirli direttamente, scrivendo il file nell'oggetto HttpResponse.

Se stai servendo file di grandi dimensioni tuttavia, si potrebbe desiderare di lasciare questo compito al server web, è possibile utilizzare il X-Accel-Redirect intestazione Nginx (e per Apache & Lighttpd) per avere il vostro server web servire il file per te.

È possibile trovare ulteriori informazioni sull'intestazione stessa in Nginx's documentation here e è possibile trovare some inspiration as to how to use that in Django here.

Una volta terminato l'invio di file tramite le viste Django, l'applicazione dell'autenticazione utente dovrebbe essere piuttosto semplice utilizzando il framework auth di Django.

Problemi correlati