使用REMOTE_USER 进行身份验证

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

当Web服务器处理身份验证时,通常会设置REMOTE_USER环境变量以在底层应用程序中使用。 在Django中,request.META属性中提供REMOTE_USER Django可以使用REMOTE_USER值使用RemoteUserMiddlewarePersistentRemoteUserMiddlewareRemoteUserBackend 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',
    '...',
]

接下来,您必须在AUTHENTICATION_BACKENDS设置中将ModelBackend替换为RemoteUserBackend

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

由于ModelBackend继承自RemoteUserBackend,您仍然具有在ModelBackend中实现的所有相同的权限检查。

is_active=False的用户将不被允许进行身份验证。 如果要允许,请使用AllowAllUsersRemoteUserBackend

在Django更改1.10:

在旧版本中,如上所述,非活动用户未被拒绝。

如果您的身份验证机制使用自定义HTTP标头而不是request.META,则可以将header作为子类,并将REMOTE_USER属性设置为所需的RemoteUserMiddleware键。 像这样:

from django.contrib.auth.middleware import RemoteUserMiddleware

class CustomHeaderMiddleware(RemoteUserMiddleware):
    header = 'HTTP_AUTHUSER'

警告

如果使用带有自定义HTTP标头的RemoteUserMiddleware子类,请非常小心。 您必须确保您的前端Web服务器总是基于适当的身份验证检查设置或删除该头,从不允许最终用户提交假冒(或“欺骗”)头值。 Since the HTTP headers X-Auth-User and X-Auth_User (for example) both normalize to the HTTP_X_AUTH_USER key in request.META, you must also check that your web server doesn’t allow a spoofed header using underscores in place of dashes.

This warning doesn’t apply to RemoteUserMiddleware in its default configuration with header = 'REMOTE_USER', since a key that doesn’t start with HTTP_ in request.META can only be set by your WSGI server, not directly from an HTTP request header.

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

在登录页面上使用REMOTE_USER

认证中间件RemoteUserMiddleware假设HTTP请求标头REMOTE_USER存在于所有经过身份验证的请求中。 当使用具有htpasswd的基本HTTP验证或其他简单机制,但使用协商(GSSAPI / Kerberos)或其他资源密集型身份验证方法时,前端HTTP服务器中的身份验证通常只为一个或几个登录URL设置,并且在成功认证后,应用程序应该维护已认证的会话本身。

PersistentRemoteUserMiddleware为此用例提供了支持。 它将维护经过身份验证的会话,直到用户明确注销。 该类可用作上述文档中的RemoteUserMiddleware的替换。