Как пройти аутентификацию с помощью REMOTE_USER

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

Когда веб-сервер заботится об аутентификации, он обычно устанавливает переменную среды REMOTE_USER для использования в базовом приложении. В Django переменная REMOTE_USER доступна в атрибуте request.META. Django может быть настроен на использование значения REMOTE_USER с помощью классов RemoteUserMiddleware или PersistentRemoteUserMiddleware, а также RemoteUserBackend, найденных в django.contrib.auth.

Конфигурация

Во-первых, вы должны добавить django.contrib.auth.middleware.RemoteUserMiddleware к параметру MIDDLEWARE после параметра django.contrib.auth.middleware.AuthenticationMiddleware:

MIDDLEWARE = [
    '...',
    '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.

Имейте в виду, что эта конкретная настройка отключает аутентификацию со значением по умолчанию ModelBackend. Это означает, что если значение REMOTE_USER не установлено, то пользователь не сможет войти в систему, даже используя интерфейс администратора Django. Добавление 'django.contrib.auth.backends.ModelBackend' к списку AUTHENTICATION_BACKENDS будет использовать ModelBackend в качестве запасного варианта, если REMOTE_USER отсутствует, что решит эти проблемы.

Управление пользователями в Django, такое как представления в contrib.admin и команда управления createsuperuser, не интегрируется с удаленными пользователями. Эти интерфейсы работают с пользователями, хранящимися в базе данных, независимо от AUTHENTICATION_BACKENDS.

Примечание

Поскольку RemoteUserBackend наследуется от ModelBackend, вы будете иметь все те же проверки прав доступа, которые реализованы в ModelBackend.

Пользователям с is_active=False не будет разрешена аутентификация. Используйте AllowAllUsersRemoteUserBackend, если вы хотите разрешить им это.

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

from django.contrib.auth.middleware import RemoteUserMiddleware

class CustomHeaderMiddleware(RemoteUserMiddleware):
    header = 'HTTP_AUTHUSER'

Предупреждение

Будьте очень осторожны при использовании подкласса RemoteUserMiddleware с пользовательским HTTP-заголовком. Вы должны быть уверены, что ваш внешний веб-сервер всегда устанавливает или удаляет этот заголовок на основе соответствующих проверок подлинности, никогда не позволяя конечному пользователю отправить поддельное (или «подмененное») значение заголовка. Поскольку HTTP-заголовки X-Auth-User и X-Auth_User (например) оба нормализуются до ключа HTTP_X_AUTH_USER в request.META, вы также должны убедиться, что ваш веб-сервер не допускает поддельных заголовков, использующих подчеркивание вместо тире.

Это предупреждение не относится к RemoteUserMiddleware в его конфигурации по умолчанию с header = 'REMOTE_USER', поскольку ключ, не начинающийся с HTTP_ в request.META, может быть установлен только вашим сервером WSGI, а не напрямую из заголовка HTTP запроса.

Если вам нужно больше контроля, вы можете создать свой собственный бэкенд аутентификации, который наследуется от RemoteUserBackend и переопределить один или несколько его атрибутов и методов.

Использование REMOTE_USER только на страницах входа в систему

Промежуточное ПО аутентификации RemoteUserMiddleware предполагает, что заголовок HTTP запроса REMOTE_USER присутствует во всех аутентифицированных запросах. Это может быть ожидаемым и практичным, когда используется Basic HTTP Auth с htpasswd или подобные механизмы, но при использовании Negotiate (GSSAPI/Kerberos) или других ресурсоемких методов аутентификации, аутентификация на внешнем HTTP-сервере обычно устанавливается только для одного или нескольких URL входа, а после успешной аутентификации приложение должно само поддерживать аутентифицированную сессию.

PersistentRemoteUserMiddleware обеспечивает поддержку этого варианта использования. Он будет поддерживать аутентифицированную сессию до явного выхода пользователя из системы. Этот класс можно использовать в качестве замены RemoteUserMiddleware в документации выше.

Вернуться на верх