Authentification sur la base de données des utilisateurs de Django depuis Apache

Étant donné que la synchronisation de plusieurs bases de données d’authentification est un problème fréquent avec Apache, vous pouvez configurer Apache afin qu’il authentifie les utilisateurs à partir du système d’authentification de Django. Cela nécessite la version 2.2 ou plus récente d’Apache ainsi que la version 2 ou plus récente de mod_wsgi. Par exemple, vous pourriez :

  • Servir des fichiers static/media limités aux utilisateurs authentifiés directement depuis Apache.
  • Accéder de manière authentifiée à un dépôt Subversion pour des utilisateurs Django ayant certaines permissions.
  • Permettre à certains utilisateurs de se connecter à un partage WebDAV créé avec mod_dav.

Note

Si vous avez installé un modèle utilisateur personnalisé et que vous voulez utiliser ce gestionnaire d’authentification par défaut, votre modèle doit prendre en charge un attribut is_active. Si vous voulez exploiter l’autorisation basée sur des groupes d’utilisateurs, votre utilisateur personnalisé doit posséder une relation nommée « groups » qui se réfère à un objet lié possédant le champ « name ». Il est aussi possible de définir son propre gestionnaire d’authentification mod_wsgi si l’utilisateur personnalisé ne peut pas répondre à ces exigences.

Authentification avec mod_wsgi

Note

L’utilisation de WSGIApplicationGroup %{GLOBAL} dans les configurations ci-dessous présuppose que l’instance d’Apache ne sert qu’une seule application Django. Si vous faites fonctionner plus d’une application Django, référez-vous à la section Defining Application Groups de la documentation de mod_wsgi pour plus d’informations au sujet de ce réglage.

Assurez-vous que mod_wsgi est installé et activé et que vous avez suivi les étapes de configuration de Apache avec mod_wsgi.

Ensuite, modifiez votre configuration Apache pour ajouter un emplacement dont vous souhaitez limiter l’accès aux utilisateurs authentifiés :

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com

WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}

<Location "/secret">
    AuthType Basic
    AuthName "Top Secret"
    Require valid-user
    AuthBasicProvider wsgi
    WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
</Location>

La directive WSGIAuthUserScript dit à mod_wsgi d’exécuter la fonction check_password dans le script wsgi indiqué, en passant le nom d’utilisateur et le mot de passe qu’il reçoit de la boîte de dialogue. Dans cet exemple, le contenu de WSGIAuthUserScript est identique à WSGIScriptAlias qui définit votre application créée par django-admin startproject.

Utilisation d’Apache 2.2 avec l’authentification

Vérifiez que mod_auth_basic et mod_authz_user sont chargés.

Ils peuvent être compilés statiquement dans Apache ou vous devez peut-être utiliser LoadModule pour les charger dynamiquement dans votre fichier httpd.conf:

LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authz_user_module modules/mod_authz_user.so

Finalement, modifiez votre script WSGI mysite.wsgi pour lier l’authentification Apache aux mécanismes d’authentification de votre site en important la fonction check_password:

import os

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

from django.contrib.auth.handlers.modwsgi import check_password

from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()

Les requêtes commençant pas /secret/ vont dorénavant exiger l’authentification des utilisateurs.

La documentation sur les mécanismes de contrôle d’accès de mod_wsgi fournissent des détails supplémentaires au sujet des méthodes alternatives d’authentification.

Autorisation avec mod_wsgi et les groupes Django

mod_wsgi offre également la possibilité de limiter l’accès à un emplacement particulier en fonction de l’appartenance à un groupe.

Dans ce cas, la configuration Apache devrait ressembler à ceci :

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}

<Location "/secret">
    AuthType Basic
    AuthName "Top Secret"
    AuthBasicProvider wsgi
    WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
    WSGIAuthGroupScript /path/to/mysite.com/mysite/wsgi.py
    Require group secret-agents
    Require valid-user
</Location>

Pour prendre en charge la directive WSGIAuthGroupScript, le même script WSGI mysite.wsgi doit aussi importer la fonction groups_for_user qui renvoie une liste de groupes auxquels l’utilisateur appartient.

from django.contrib.auth.handlers.modwsgi import check_password, groups_for_user

Les requêtes à /secret/ vont dorénavant aussi exiger que l’utilisateur soit membre du groupe « secret-agents ».

Back to Top