2009-08-27 9 views
13

Estoy creando un sitio donde los usuarios registrados pueden subir archivos. Esos archivos se sirven a través de Apache. Solo los usuarios que hayan iniciado sesión deberían poder acceder a esos archivos.Acceso seguro a medios estáticos en un sitio de Django

He leído this page pero parece que las personas tendrían que iniciar sesión dos veces para acceder tanto al sitio como a los medios, cada vez usando un tipo diferente de cuadro de inicio de sesión.

¿Hay alguna forma de evitar esto o hay alguna otra forma de limitar el acceso a medios estáticos servidos por Apache usando la base de datos de autenticación de Django?

Estoy usando mod_python.

EDITAR: ¿Cómo terminé resolver esto después de leer la respuesta y this de Van Gale:

  1. cambió a WSGI.
  2. Instalado mod_xsendfile
  3. Movido todos los archivos multimedia en una subcarpeta pública en/media/pública
  4. acceso añadido a la carpeta pública utilizando un alias/media//var/www.../media/public pública
  5. WSGIScriptAlias ​​Añadido/media/protected//var/www.../apache/django.wsgi (el mismo controlador como para el resto del sitio)
  6. Agregado XSendFile On y XSendFileAllowAbove en
  7. para la aplicación de Django añadí un urlconf para/media/protected que hace básicamente lo que es here, solo modificado para mi auth sistema de entrada Maneja URL como/media/protected/GROUP_ID/file para que solo los miembros del GROUP puedan descargar los archivos.
+0

El otro problema posible con el enfoque descrito en los documentos de Django es que parece estar utilizando autenticación básica; esto envía contraseñas en texto sin cifrar base64, por lo que no es seguro a menos que también use SSL para todas las solicitudes. –

Respuesta

10

La forma habitual de hacerlo es devolver un encabezado especial al servidor web.

Puede hacerlo con nginx usando x-accel-redirect como en este Django snippet.

Para Apache, debería ser bastante similar usando el módulo mod_xsendfile (discussion and examples en la lista de distribución de usuarios de Django).

+0

Voy a probar el mod_xsendfile. –

+0

¡Funcionó! Tuve que cambiar a WSGI, pero no fue tan difícil como pensé que sería. –

+0

En mod_wsgi 3.0, puede volver a pasar una ubicación con estado 200. Sin embargo, los directorios deben asignarse a través de una URL, que luego se referencia en Ubicación.Dado que se requiere la asignación de URL, para garantizar que los clientes remotos no puedan acceder a ellos, debe usar una regla mod_rewrite para prohibirlos, sino es una sub solicitud de Apache. La otra opción es hacer uso de la extensión wsgi.file_wrapper para devolver el archivo directamente desde Django. En este momento no se puede hacer esto con Django, pero se permitirá en la versión futura. –

2

Si usted tiene la libertad de cambiar de Apache para lighttpd, a continuación, la solución más sencilla sería utilizar mod_secdownload que hacer exactamente lo que quiere, es decir, proporcionar autenticación aplicación, mientras que servir a los archivos reales a través del servidor web.

Sin embargo, si está atascado con Apache, sugiero mod_auth_token, aquí mencionan PHP pero puede generar el token en Python o en cualquier otro idioma. Usando mod_auth_token, podrás generar el token en tu aplicación y luego hacer que el servidor web sirva el archivo estático utilizando ese token.

Cuestiones relacionadas