Как выполнить аутентификацию с помощью REMOTE_USER
В данном документе описано, как использовать внешние источники аутентификации (где веб-сервер устанавливает переменную среды REMOTE_USER) в ваших приложениях Django. Этот тип решения для аутентификации обычно используется на корпоративных сайтах с решениями единого входа, такими как IIS и интегрированная аутентификация Windows или 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) или других ресурсоёмких методах аутентификации, аутентификация на фронт-энд веб-сервере обычно настраивается только для одной или нескольких страниц входа, а после успешной аутентификации приложение должно самостоятельно поддерживать аутентифицированную сессию.
PersistentRemoteUserMiddleware предоставляет поддержку для этого случая. Он будет сохранять аутентифицированную сессию до явного выхода пользователя из системы. Этот класс можно использовать как прямую замену RemoteUserMiddleware в документе выше.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.0/howto/auth-remote-user/