Аутентификация с использованием 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конфигурации по умолчанию с , поскольку ключ, который не начинается с in, может быть установлен только вашим сервером WSGI, а не непосредственно из заголовка HTTP-запроса.header = 'REMOTE_USER'HTTP_request.META

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

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

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

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

Copyright ©2021 All rights reserved