使用 REMOTE_USER 进行身份验证 — Django 文档

来自菜鸟教程
Django/docs/3.2.x/howto/auth-remote-user
跳转至:导航、​搜索

使用 REMOTE_USER 进行身份验证

本文档描述了如何在 Django 应用程序中使用外部身份验证源(Web 服务器在其中设置 REMOTE_USER 环境变量)。 此类身份验证解决方案通常出现在 Intranet 站点上,具有单点登录解决方案,例如 IIS 和集成 Windows 身份验证或 Apache 和 mod_authnz_ldapCASCosign ]、WebAuthmod_auth_sspi等。

当 Web 服务器处理身份验证时,它通常会设置 REMOTE_USER 环境变量以在底层应用程序中使用。 在 Django 中,REMOTE_USERrequest.META 属性中可用。 Django 可以配置为使用 RemoteUserMiddlewarePersistentRemoteUserMiddleware 以及 django.contrib 中的 RemoteUserBackend 类来使用 REMOTE_USER 值。身份验证。

配置

首先,您必须将 django.contrib.auth.middleware.RemoteUserMiddleware 添加到 :setting:`MIDDLEWARE` 设置 之后 django.contrib .auth.middleware.AuthenticationMiddleware:

MIDDLEWARE = [
    '...',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.RemoteUserMiddleware',
    '...',
]

接下来,您必须将 :setting:`AUTHENTICATION_BACKENDS` 设置中的 ModelBackend 替换为 RemoteUserBackend

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.RemoteUserBackend',
]

通过此设置,RemoteUserMiddleware 将检测 request.META['REMOTE_USER'] 中的用户名,并将使用 RemoteUserBackend 验证和自动登录该用户。

请注意,此特定设置禁用了默认 ModelBackend 的身份验证。 这意味着如果 REMOTE_USER 值未设置,则用户无法登录,即使使用 Django 的管理界面。 如果 REMOTE_USER 不存在,将 'django.contrib.auth.backends.ModelBackend' 添加到 AUTHENTICATION_BACKENDS 列表将使用 ModelBackend 作为后备,这将解决这些问题。

Django 的用户管理,例如 contrib.admin:djadmin:`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'

警告

如果使用带有自定义 HTTP 标头的 RemoteUserMiddleware 子类,请务必小心。 您必须确保您的前端 Web 服务器始终根据适当的身份验证检查设置或删除该标头,决不允许最终用户提交虚假(或“欺骗”)标头值。 由于 HTTP 标头 X-Auth-UserX-Auth_User(例如)都标准化为 request.META 中的 HTTP_X_AUTH_USER 键,您还必须检查您的 Web 服务器是否没有t 允许使用下划线代替破折号的欺骗标题。

此警告不适用于 header = 'REMOTE_USER' 的默认配置中的 RemoteUserMiddleware,因为在 request.META 中不以 HTTP_ 开头的键只能是由您的 WSGI 服务器设置,而不是直接从 HTTP 请求标头设置。


如果您需要更多控制,您可以创建自己的身份验证后端,该后端继承自 RemoteUserBackend 并覆盖其一个或多个属性和方法。


仅在登录页面上使用 REMOTE_USER

RemoteUserMiddleware 身份验证中间件假定 HTTP 请求标头 REMOTE_USER 与所有经过身份验证的请求一起存在。 当使用具有 htpasswd 或类似机制的基本 HTTP 身份验证或类似机制时,这可能是预期和实用的,但使用协商(GSSAPI/Kerberos)或其他资源密集型身份验证方法时,前端 HTTP 服务器中的身份验证通常只是设置一个或几个登录 URL,并且在成功验证后,应用程序应该自己维护经过验证的会话。

PersistentRemoteUserMiddleware 为这个用例提供支持。 它将保持经过身份验证的会话,直到用户明确注销。 该类可用作上述文档中 RemoteUserMiddleware 的替代品。