REMOTE_USER
¶进行身份验证本文档介绍如何在Django应用程序中使用外部认证源(其中Web服务器设置REMOTE_USER
环境变量)。 这种类型的身份验证解决方案通常在内部网站上看到,使用单一登录解决方案(如IIS和集成Windows身份验证或Apache)和mod_authnz_ldap,CAS,Cosign ,WebAuth,mod_auth_sspi等
当Web服务器处理身份验证时,通常会设置REMOTE_USER
环境变量以在底层应用程序中使用。 在Django中,request.META
属性中提供REMOTE_USER
。 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',
'...',
]
接下来,您必须在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
。
在旧版本中,如上所述,非活动用户未被拒绝。
如果您的身份验证机制使用自定义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
的替换。
2017年9月6日