Pregunta

Estoy sirviendo la información "sensible" en PDF y hojas de cálculo descargable dentro de una sección de registro de usuarios de un sitio.

¿Hay una manera de permitir la autenticación de Django para asegurar este medio sin servirlo (y no tener que manualmente inicio de sesión utilizando autenticación básica)?

supongo theres (dedos cruzados) no una manera de hacerlo con el pseudo código de abajo, pero ayuda a ilustrar mejor el objetivo final.

#urls.py
(r'^protected_media/(?P<filename>.*)$', 'protected_media')

#views.py
from django.contrib.auth.decorators import login_required

@login_required
def protected_media(request, filename):
    # @login_required bounces you out to the login url
    # if logged in, serve "filename" from Apache
¿Fue útil?

Solución

Me parece que el método que se indica en el código debe trabajar. Es realmente no es diferente de cualquier otro recurso protegido: sus puntos de vista pueden servir archivos de discos, registros de bases de datos, plantillas prestados o nada. Al igual que el decorador login_required impide el acceso no autorizado a otros puntos de vista, se evitará que dicho acceso a la vista que sirve medios protegidos.

Me estoy perdiendo algo de su pregunta aquí? Por favor aclarar si ese es el caso.

EDIT: En relación con el enlace doc Django en su comentario: que es el método por el simple hecho de servir cualquier archivo de solicitud de un directorio en particular. Por lo tanto, en ese ejemplo URLs como /site_media/foo.jpg, /site_media/somefolder/bar.jpg buscará automáticamente los archivos foo.jpg y somefolder/bar.jpg bajo document_root. Básicamente, cada cosa bajo document_root estará disponible al público. Eso es, obviamente inseguro. Por lo que evitar que con su método.

También se considera ineficiente debido a Django es simplemente añadiendo una gran cantidad de sobrecarga innecesaria cuando todo lo que necesita es algo así como Apache para tomar una solicitud de URL y asignarla a un archivo en el disco duro. (No es necesario sesiones de Django, solicitar el procesamiento, etc.)

En su caso, esto puede no ser una gran preocupación. En primer lugar, se ha asegurado la vista. En segundo lugar, depende de sus patrones de uso. ¿Cuántas solicitudes anticipa usted para estos archivos? Sólo se utiliza para la autenticación de Django - ¿justifica eso otros gastos generales? Si no es así, se puede mirar en servir a esos archivos con Apache y el uso de un proveedor de autenticación. Para más información sobre esto, consulte la documentación mod_wsgi:

Existen mecanismos similares disponibles bajo mod_python creo. (Actualización:.. Solo se dio cuenta de la otra respuesta Por favor, véase la respuesta de Andre como el método mod_python)

EDIT 2: Con respecto al código para servir a un archivo, por favor ver este fragmento:

El método utiliza una send_file FileWrapper que es bueno para el envío de grandes archivos estáticos de vuelta (no se lee todo el archivo en la memoria). Usted tendría que cambiar el content_type dependiendo del tipo de archivo que va a enviar (pdf, jpg, etc.).

Otros consejos

Django para obtener más información sobre la compra de entradas. Comience en la parte inferior para ahorrar un poco de tiempo. Parece que acaba de perder entrar en Django 1.2, y supongo que tampoco es de 1.3.

Para Nginx, he encontrado este Django fragmento que se aprovecha de la X Accel-redireccionamiento cabecera , pero no han probado todavía.

porción más eficiente de los archivos estáticos a través de Django está siendo estudiada actualmente como parte del proyecto de Google SOC. Para WSGI esto va a usar wsgi.file_wrapper extensiones para WSGI si está disponible, como lo es para mod_wsgi y req.sendfile () si se utiliza mod_python. También apoyará regresar de cabeceras como 'Lugar', 'X-Accel-redirección' y otros, los cuales diferentes de alojamiento web mecanismos y delante de proxy termina aceptar como un medio para servir archivos estáticos en el lugar es definido por una aplicación secundaria de web , que no es tan eficiente como interfaz para servir archivos estáticos.

No estoy seguro de si hay una página del proyecto para esto en Django wiki de alguna parte o no, pero los cambios en el código se cometen en las ramas / soc2009 / http-WSGI mejoras rama de Django repositorio de código fuente.

Es necesario no espere estrictamente para esas cosas. Sólo está poniendo una interfaz limpia y portátil en su lugar a través de los diferentes mecanismos. Si se utiliza como nginx parte delantera frente a Apache / mod_wsgi, podría utilizar X-Accel-redirección ahora. Si se utiliza el modo de Apache / mod_wsgi 3.0 y demonio, podría utilizar Localización ahora, pero sí es necesario para asegurar que configura Apache correcta. Como alternativa, puede implementar su propio envoltorio WSGI middleware en torno a la aplicación Django que se ve por alguna cabecera de la respuesta de su propio archivo para indicar que ser devuelto y que utiliza para volver wsgi.file_wrapper que en lugar de respuesta real de regresar de Django.

Por cierto, los mecanismos de autentificación de gancho que figuran tanto para mod_python y mod_wsgi por otros se utilizan autenticación básica HTTP, que no es lo que quería. Esto es suponiendo desea que los archivos a ser protegidos por el mecanismo de acceso basada en la forma de Django el uso de cookies y sesiones de back-end.

Si entiendo bien su pregunta desea restringir el acceso a los archivos que no están siendo atendidas por Django, por ejemplo, con un servidor Apache?

Lo que se requeriría entonces es de alguna manera para este servidor Apache usar Django como una fuente de autenticación.

Esta django fragmento describe un método de este tipo. Se crea un controlador de acceso en Django que es utilizado por Apache cuando la solicitud de un archivo estático viene en que necesita ser protegida:

<Location "/protected/location">
            PythonPath "['/path/to/proj/'] + sys.path"  
            PythonOption DJANGO_SETTINGS_MODULE myproj.settings
        PythonOption DjangoPermissionName '<permission.codename>'
        PythonAccessHandler my_proj.modpython #this should point to accesshandler
            SetHandler None
</Location>

Espero que esta ayuda, el fragmento fue publicada hace un tiempo, así que las cosas podrían haber cambiado entre versiones de Django:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top