REMOTE_USER
¶本文档介绍如何使用外部身份验证源(其中Web服务器设置 REMOTE_USER
环境变量)在Django应用程序中。这种类型的身份验证解决方案通常出现在内部网站点上,使用单点登录解决方案,如IIS和集成的Windows身份验证或Apache和 mod_authnz_ldap , CAS , Cosign , 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
关键。例如::
from django.contrib.auth.middleware import RemoteUserMiddleware
class CustomHeaderMiddleware(RemoteUserMiddleware):
header = "HTTP_AUTHUSER"
警告
如果使用 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
在上述文件中。
7月 22, 2024