Authentification avec REMOTE_USER

Ce document présente la procédure pour utiliser des sources d’authentification externes (pour lesquelles le serveur Web définit la variable d’environnement REMOTE_USER) dans vos applications Django. Ce type de solution d’authentification est typique des sites intranet, avec des solutions d’authentification centralisée comme IIS et Integrated Windows Authentication ou Apache et mod_authnz_ldap, CAS, Cosign, WebAuth, mod_auth_sspi, etc.

Lorsque le serveur Web se charge de l’authentification, il définit généralement la variable d’environnement REMOTE_USER à destination de l’application sous-jacente. Dans Django, REMOTE_USER est accessible par l’attribut request.META. Django peut être configuré pour exploiter la valeur REMOTE_USER en utilisant les classes RemoteUserMiddleware et RemoteUserBackend qui se trouvent dans django.contrib.auth.

Configuration

class django.contrib.auth.middleware.RemoteUserMiddleware

Vous devez tout d’abord ajouter django.contrib.auth.middleware.RemoteUserMiddleware au réglage MIDDLEWARE_CLASSES après la valeur django.contrib.auth.middleware.AuthenticationMiddleware :

MIDDLEWARE_CLASSES = (
    ...
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.RemoteUserMiddleware',
    ...
    )

Puis, vous devez remplacez ModelBackend par RemoteUserBackend dans le réglage AUTHENTICATION_BACKENDS :

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.RemoteUserBackend',
)

Avec cette configuration, RemoteUserMiddleware va détecter le nom d’utilisateur dans request.META['REMOTE_USER'] et va authentifier et connecter automatiquement cet utilisateur à l’aide de

Note

Comme RemoteUserBackend hérite de ModelBackend, le contrôle des permissions implémenté dans ModelBackend est toujours disponible.

Si votre mécanisme d’authentification utilise un en-tête HTTP personnalisé à la place de REMOTE_USER, vous pouvez créer une sous-classe de RemoteUserMiddleware et définir l’attribut header` à la clé de request.META correspondante. Par exemple :

from django.contrib.auth.middleware import RemoteUserMiddleware

class CustomHeaderMiddleware(RemoteUserMiddleware):
    header = 'HTTP_AUTHUSER'

RemoteUserBackend

class django.contrib.auth.backends.RemoteUserBackend

Si vous avez besoin de plus de maîtrise, vous pouvez créer votre propre moteur d’authentification héritant de RemoteUserBackend et surchargeant certaines parties :

Attributs

RemoteUserBackend.create_unknown_user

True ou False. Détermine si un objet User est créé s’il n’est pas trouvé dans la base de données. La valeur par défaut est True.

Méthodes

RemoteUserBackend.authenticate(remote_user)

Le nom d’utilisateur transmis à remote_user est considéré comme sûr. Cette méthode renvoie simplement l’objet User ayant le nom d’utilisateur indiqué, créant un nouvel utilisateur si create_unknown_user vaut True.

Renvoie None si create_unknown_user vaut False et un objet User ayant le nom d’utilisateur indiqué si ce dernier n’existe pas encore dans la base de données.

RemoteUserBackend.clean_username(username)

Procède au nettoyage de username (par ex. raccourcissement de l’information DN de LDAP) avant de l’utiliser pour obtenir ou créer un objet User. Renvoie le nom d’utilisateur nettoyé.

RemoteUserBackend.configure_user(user)

Configure un nouvel utilisateur. Cette méthode est appelée immédiatement après la création d’un nouvel utilisateur et peut être utilisée pour effectuer des actions de configuration personnalisées, comme l’attribution de groupes d’utilisateurs en fonction d’attributs d’un répertoire LDAP. Renvoie l’objet utilisateur.