2012-03-21 14 views
6

Estoy creando un sistema que permite a los usuarios generar documentos y luego descargarlos. Los documentos son PDF (no es que importe por el bien de esta pregunta) y cuando se generan los almaceno en mi sistema de archivos local que el servidor web se está ejecutando con nombres de archivos uuidRestringir el acceso a archivos estáticos en Django/Nginx

c7d43358-7532-4812- b828-b10b26694f0f.pdf

pero sé "seguridad por oscuridad" no es la solución correcta ...

Quiero restringir el acceso a los archivos que en una base por cuenta de si es posible. Una cosa que creo que podría hacer es subirlos a S3 y proporcionar una URL firmada, pero quiero evitar eso por ahora si es posible.

estoy usando Nginx/Django/Gunicorn/EC2/S3

¿Qué otras soluciones?

Respuesta

3

¿Qué le parece aplicar user==owner en el nivel de vista, impidiendo el acceso a los archivos, almacenándolos como FileFields, y solo recuperando el archivo si se cumple esa condición.

p. Ej. Puede usar el @login_requireddecorator en la vista para permitir el acceso solo si está conectado. Esto podría refinarse usando request.user para verificar contra el propietario del archivo. Es probable que la sección de autenticación de usuario del Django documentation sea útil aquí.

La otra opción, como mencionas es a través de S3, generando urls dentro de Django que tienen una cadena de consulta que permite a un usuario autenticado acceder para descargar un objeto s3 en particular con un límite de tiempo. Los detalles sobre eso se pueden encontrar en el s3 documentation. Se ha realizado una pregunta similar antes del here en SO.

1

He utilizado django-private-files con gran éxito, impone la protección en el nivel de vista y utiliza diferentes servidores para hacer la transferencia de archivos real.

10

Si está sirviendo archivos pequeños, puede usar Django para servirlos directamente, escribiendo el archivo en el objeto HttpResponse.

Si usted está sirviendo archivos de gran tamaño sin embargo, es posible que desee dejar esa tarea a su servidor web, puede utilizar la cabecera X-Accel-Redirect en Nginx (y para Apache & Lighttpd) para tener su servidor web sirve el archivo para usted.

Puede encontrar más información sobre el encabezado en sí in Nginx's documentation here, y puede encontrar some inspiration as to how to use that in Django here.

Una vez que haya terminado de enviar archivos a través de las vistas de Django, la aplicación de la autenticación del usuario debe ser bastante directa utilizando el marco de autenticación de Django.

Cuestiones relacionadas