使用 REMOTE_USER 进行身份验证 — Django 文档
使用 REMOTE_USER 进行身份验证
本文档描述了如何在 Django 应用程序中使用外部身份验证源(Web 服务器在其中设置 REMOTE_USER
环境变量)。 此类身份验证解决方案通常出现在 Intranet 站点上,具有单点登录解决方案,例如 IIS 和集成 Windows 身份验证或 Apache 和 mod_authnz_ldap、CAS、Cosign ]、WebAuth、mod_auth_sspi等。
当 Web 服务器处理身份验证时,它通常会设置 REMOTE_USER
环境变量以在底层应用程序中使用。 在 Django 中,REMOTE_USER
在 request.META 属性中可用。 Django 可以配置为使用 RemoteUserMiddleware
或 PersistentRemoteUserMiddleware
以及 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-User
和 X-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 的替代品。