2009-07-11 6 views
24

Je diffuse des informations "sensibles" dans des fichiers PDF et des feuilles de calcul téléchargeables dans une section d'inscription d'un site.Comment devez-vous vous connecter aux fichiers multimédia dans Django?

Existe-t-il un moyen de permettre à l'authentification django de sécuriser ce support sans le le servant (et de ne pas avoir à se connecter manuellement en utilisant l'authentification de base)?

Je devine theres (croisés les doigts) pas une manière de le faire avec le code de psuedo ci-dessous, mais il aide à mieux illustrer l'objectif 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 

Répondre

9

Il me semble que la méthode que vous avez décrite dans votre code devrait fonctionner. Ce n'est vraiment pas différent de toute autre ressource protégée: vos vues peuvent servir des fichiers à partir de disques, d'enregistrements de bases de données, de modèles rendus ou de n'importe quoi. Tout comme le décorateur login_required empêche tout accès non autorisé à d'autres vues, il empêchera un tel accès à votre vue de servir de support protégé.

Ai-je raté quelque chose de votre question ici? S'il vous plaît clarifier si c'est le cas.

EDIT: En ce qui concerne le lien doc django dans votre commentaire: c'est la méthode pour simplement servir n'importe quel fichier de requête d'un répertoire particulier. Ainsi, dans cet exemple, les URL /site_media/foo.jpg, /site_media/somefolder/bar.jpg rechercheront automatiquement les fichiers foo.jpg et somefolder/bar.jpg sous document_root. Fondamentalement, tout sous document_root sera publiquement disponible. C'est évidemment peu sûr. Donc vous évitez cela avec votre méthode. Il est également considéré comme inefficace car django ne fait qu'ajouter beaucoup de frais inutiles quand tout ce dont vous avez besoin est quelque chose comme Apache pour prendre une requête d'URL et la mapper à un fichier sur le disque dur. (Vous n'avez pas besoin de sessions django, de traitement des demandes, etc.)

Dans votre cas, cela peut ne pas être si important. D'abord, vous avez sécurisé la vue. Deuxièmement, cela dépend de vos habitudes d'utilisation. Combien de demandes anticipez-vous pour ces fichiers? Vous n'utilisez que django pour l'authentification - cela justifie-t-il d'autres frais généraux? Si ce n'est pas le cas, vous pouvez envisager de traiter ces fichiers avec Apache et d'utiliser un fournisseur d'authentification. Pour en savoir plus, consultez la mod_wsgi documentation:

Il existe des mécanismes similaires disponibles sous mod_python Je crois. (Mise à jour: il suffit de remarquer l'autre réponse S'il vous plaît voir la réponse d'André pour la méthode mod_python..)

EDIT 2: En ce qui concerne le code pour servir un fichier, s'il vous plaît voir cet extrait:

Vous devrez changer le content_type en fonction du type de fichier que vous envoyez (pdf, jpg, etc).

+0

Hey Ars, j'aurais dû clarifier que j'essaie de médiatiser la préoccupation suivante des docs django: http://docs.djangoproject.com/fr/dev/howto/static-files/#the-big -fat-disclaimer Si cette ligne de pseudo-code est valide, comment l'accomplissez-vous? # si connecté, servir "nom de fichier" d'Apache Merci! -Tom – TomFuertes

+0

Got it; juste mis à jour la réponse. J'espère que cela t'aides. – ars

1

Si je comprends bien votre question, vous voulez restreindre l'accès aux fichiers qui ne sont pas servis par Django, par exemple, avec un serveur Apache? Ce dont vous auriez alors besoin, c'est que ce serveur Apache puisse utiliser Django comme source d'authentification.

Cette django snippet décrit une telle méthode. Il crée un gestionnaire d'accès à Django qui est utilisé par Apache lorsqu'une demande d'un fichier statique vient qui doit être protégé:

<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> 

Hope this helps, l'extrait a été publié il y a un certain temps, les choses pourraient avoir changé entre les versions de Django :)

3

La diffusion plus efficace des fichiers statiques via Django est actuellement examinée dans le cadre du projet Google SOC. Pour WSGI, cela utilisera les extensions wsgi.file_wrapper pour WSGI si disponible, comme pour mod_wsgi, et req.sendfile() si vous utilisez mod_python. Il prendra également en charge le retour des en-têtes tels que 'Location', 'X-Accel-Redirect' et autres, que les différents mécanismes d'hébergement Web et frontaux proxy acceptent comme moyen de servir des fichiers statiques où l'emplacement est défini par une application web principale , qui n'est pas aussi efficace que le frontal pour servir des fichiers statiques. Je ne suis pas sûr qu'il y ait une page de projet pour cela dans le wiki Django quelque part ou pas, mais les changements de code sont en cours de validation dans la branche branches/soc2009/http-wsgi-améliorations du référentiel de code source Django.

Vous n'avez pas besoin d'attendre strictement ce genre de choses. Il s'agit simplement de mettre en place une interface propre et portable à travers les différents mécanismes. Si vous utilisez nginx comme front end devant Apache/mod_wsgi, vous pouvez utiliser X-Accel-Redirect maintenant. Si vous utilisez le mode Apache/mod_wsgi 3.0 et le démon, vous pouvez utiliser Location now, mais vous devez vous assurer que vous avez bien configuré Apache. Alternativement, vous pouvez implémenter votre propre wrapper middleware WSGI autour de l'application Django qui cherche votre propre en-tête de réponse pour indiquer le fichier à renvoyer et qui utilise wsgi.file_wrapper pour le renvoyer au lieu de la réponse réelle renvoyée par Django. Par ailleurs, les mécanismes de hook d'authentification répertoriés pour mod_python et mod_wsgi par d'autres utilisateurs utiliseraient l'authentification de base HTTP, ce qui n'est pas ce que vous souhaitiez. Cela suppose que vous voulez que les fichiers soient protégés par un mécanisme de connexion basé sur un formulaire Django en utilisant des cookies et des sessions backend.

4

Lisez ceci Django ticket pour plus d'informations. Commencez par le bas pour économiser du temps. On dirait qu'il a juste manqué d'entrer dans Django 1.2, et je suppose qu'il n'est pas non plus dans 1.3.

Pour Nginx, j'ai trouvé ce Django snippet qui tire parti de l'en-tête X-Accel-Redirect, mais je ne l'ai pas encore essayé.

Questions connexes