Authentication using REMOTE_USER

本文档介绍如何在Django应用程序中使用外部认证源(其中Web服务器设置REMOTE_USER环境变量)。This type of authentication solution is typically seen on intranet sites, with single sign-on solutions such as IIS and Integrated Windows Authentication or Apache and mod_authnz_ldap, CAS, Cosign, WebAuth, mod_auth_sspi, etc.

当Web服务器处理身份验证时,通常会设置REMOTE_USER环境变量以在底层应用程序中使用。在Django中,request.META属性中提供REMOTE_USERDjango can be configured to make use of the REMOTE_USER value using the RemoteUserMiddleware and RemoteUserBackend classes found in django.contrib.auth.

Configuration

First, you must add the django.contrib.auth.middleware.RemoteUserMiddleware to the MIDDLEWARE_CLASSES setting after the django.contrib.auth.middleware.AuthenticationMiddleware:

MIDDLEWARE_CLASSES = (
    '...',
    '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的管理界面,用户也无法登录。Adding 'django.contrib.auth.backends.ModelBackend' to the AUTHENTICATION_BACKENDS list will use ModelBackend as a fallback if REMOTE_USER is absent, which will solve these issues.

Django的用户管理(例如contrib.admin中的视图和createsuperuser管理命令)不会与远程用户集成。这些接口与存储在数据库中的用户无关,不管AUTHENTICATION_BACKENDS

注意

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

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

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.

此警告不适用于其默认配置中的RemoteUserMiddleware,其中 = 'REMOTE_USER' / t2>,因为在request.META中不以HTTP_开头的密钥只能由WSGI服务器设置,而不能直接从HTTP请求头设置。

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