Аутентификация при помощи REMOTE_USER

Документ описывает использование внешних источников аутентификации (когда на веб-сервере установлена переменная REMOTE_USER) в приложениях Django. Этот тип аутентификации является типичным для интранет-сайтов, использующих такие решения как IIS и Integrated Windows Authentication или Apache и mod_authnz_ldap, CAS, Cosign, WebAuth, mod_auth_sspi.

Для обеспечения наибольшей безопасности Web-сервер устанавливает переменную окружения REMOTE_USER и использует её в базовом приложении. В Django, REMOTE_USER доступна в атрибуте request.META. Настройте Django для того, чтобы задействовать переменную REMOTE_USER, используя классы RemoteUserMiddleware и RemoteUserBackend из django.contrib.auth.

Конфигурирование

class django.contrib.auth.middleware.RemoteUserMiddleware

Сначала нужно добавить django.contrib.auth.middleware.RemoteUserMiddleware в настройки MIDDLEWARE_CLASSES после django.contrib.auth.middleware.AuthenticationMiddleware:

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

Затем заменить ModelBackend на RemoteUserBackend в настройках AUTHENTICATION_BACKENDS:

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

С такими настройками RemoteUserMiddleware обнаружит имя пользователя в запросе request.META['REMOTE_USER'], аутентифицирует его и выполнит вход, используя RemoteUserBackend.

Примечание

Поскольку RemoteUserBackend наследуется от ModelBackend, вам всё равно придётся проверять процедуру аутентификации, реализованную при помощи ModelBackend.

Если механизм аутентификации использует обычные HTTP-заголовки и не содержит REMOTE_USER, вы можете создать подкласс RemoteUserMiddleware и установить атрибут header с ключом request.META. Например:

from django.contrib.auth.middleware import RemoteUserMiddleware

class CustomHeaderMiddleware(RemoteUserMiddleware):
    header = 'HTTP_AUTHUSER'

RemoteUserBackend

class django.contrib.auth.backends.RemoteUserBackend

При необходимости большего контроля допускается создание собственного бэкэнда(backend) аутентификации, который должен наследоваться от RemoteUserBackend и отменять кое-что:

Атрибуты

RemoteUserBackend.create_unknown_user

True или False. Определяет может ли быть создан объект класса User, уже имеющийся в базе данных. По-умолчанию True.

Методы

RemoteUserBackend.authenticate(remote_user)

Имя пользователя передаётся как remote_user, что считается надёжным. Этот метод просто возвращает объект User с данным именем пользователя и создаёт новый пользовательский объект, если атрибут create_unknown_user установлен в True.

Возвращает None, если атрибут create_unknown_user установлен в False и объект User с данным именем пользователя, если он не найден в базе данных.

RemoteUserBackend.clean_username(username)

Очищает username (например, информацию LDAP DN ) прежде, чем получить или создать объект User. Возвращает чистое имя пользователя.

RemoteUserBackend.configure_user(user)

Настройки для созданного пользователя. Этот метод вызывается сразу после создания пользователя и может быть использован для настройки пользовательских групп на основе атрибутов каталога LDAP. Возвращает пользовательский объект.