REMOTE_USER¶本文档描述了如何使用外部身份验证源(Web服务器设置 REMOTE_USER 环境变量)在Django应用程序中。 这种类型的身份验证解决方案通常出现在内联网网站上,具有单点登录解决方案,例如IIS和集成Windows身份验证或Apache和 mod_authnz_ldap , CAS , WebAuth , mod_auth_sspi 等。
当Web服务器负责身份验证时,它通常会将 REMOTE_USER 在基础应用程序中使用的环境变量。在姜戈, 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 钥匙 例如:
mysite/middleware.py¶ from django.contrib.auth.middleware import RemoteUserMiddleware
class CustomHeaderRemoteUserMiddleware(RemoteUserMiddleware):
header = "HTTP_AUTHUSER"
然后在 MIDDLEWARE 设置而不是 django.contrib.auth.middleware.RemoteUserMiddleware
MIDDLEWARE = [
"...",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"mysite.middleware.CustomHeaderRemoteUserMiddleware",
"...",
]
警告
如果使用 RemoteUserMiddleware 使用自定义HTTP头的子类。您必须确保前端Web服务器始终根据适当的身份验证检查设置或删除该头,而不允许最终用户提交假(或“欺骗”)头值。因为HTTP头 X-Auth-User 和 X-Auth_User (例如)两个标准化为 HTTP_X_AUTH_USER 键入 request.META ,您还必须检查您的Web服务器是否允许使用下划线代替破折号的欺骗头。
此警告不适用于 RemoteUserMiddleware 在其默认配置中 header = 'REMOTE_USER' ,因为不是以 HTTP_ 在里面 request.META 只能由WSGi服务器设置,不能直接从HTTP请求头设置。
如果您需要更多的控制,您可以创建自己的身份验证后端,它继承自 RemoteUserBackend 并重写其一个或多个属性和方法。
REMOTE_USER 仅在登录页上¶这个 RemoteUserMiddleware 身份验证中间件假设HTTP请求标头 REMOTE_USER 与所有经过验证的请求一起存在。当使用基本的HTTP授权时,这可能是预期的和实用的 htpasswd 或使用类似的机制,但使用Negotiate(GSSAPI/RST)或其他资源密集型认证方法,前端HTTP服务器中的认证通常只为一个或几个登录URL设置,认证成功后,应用程序应该维护经过认证的会话本身。
PersistentRemoteUserMiddleware 为这个用例提供支持。它将维护经过身份验证的会话,直到用户显式注销。该类可以作为替换 RemoteUserMiddleware 在上述文件中。
5月 28, 2025