如何使用进行身份验证 REMOTE_USER

本文档介绍如何使用外部身份验证源(其中Web服务器设置 REMOTE_USER 环境变量)在Django应用程序中。这种类型的身份验证解决方案通常出现在内部网站点上,使用单点登录解决方案,如IIS和集成的Windows身份验证或Apache和 mod_authnz_ldapCASCosignWebAuthmod_auth_sspi

当Web服务器负责身份验证时,它通常会将 REMOTE_USER 在基础应用程序中使用的环境变量。在姜戈, REMOTE_USER 中提供的 request.META 属性。Django可以配置为使用 REMOTE_USER 值使用 RemoteUserMiddlewarePersistentRemoteUserMiddleware ,以及 RemoteUserBackend 中找到的类 django.contrib.auth

配置

首先,您必须添加 django.contrib.auth.middleware.RemoteUserMiddlewareMIDDLEWARE 设置 之后 这个 django.contrib.auth.middleware.AuthenticationMiddleware ::

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

接下来,您必须替换 ModelBackend 具有 RemoteUserBackendAUTHENTICATION_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-UserX-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 在上述文件中。