# Documentation Django 3.1.9.dev

# 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 ».