Spec-Zone.ru › Django 1.10

Авторизация с использованием 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, если хотите разрешить им это.

Изменено в Django 1.10:

В более ранних версиях неактивные пользователи не отклонялись, как описано выше.

Если ваш механизм авторизации использует пользовательский 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 только на страницах входа

Новое в Django 1.9.

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

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

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.10/howto/auth-remote-user/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API