“Django/docs/3.0.x/howto/auth-remote-user”的版本间差异

来自菜鸟教程
Django/docs/3.0.x/howto/auth-remote-user
跳转至:导航、​搜索
(autoload)
 
(Page commit)
 
第1行: 第1行:
 +
{{DISPLAYTITLE:使用 REMOTE_USER 进行身份验证 — Django 文档}}
 
<div id="authentication-using-remote-user" class="section">
 
<div id="authentication-using-remote-user" class="section">
  
= 使用 <code>REMOTE_USER</code> 进行身份验证 =
+
= 使用 REMOTE_USER 进行身份验证 =
  
本文档描述如何在 Django 应用中使用外部身份验证资源(在 web 服务器上设置 <code>REMOTE_USER</code> 环境变量的地方)。这种类型的身份验证方法一般用在使用了单点登录方案的内部网站上,比如 IIS Windows 一体化验证或者 Apache 和 [https://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html mod_authnz_ldap], [https://www.apereo.org/projects/cas CAS], [http://weblogin.org Cosign], [https://www.stanford.edu/services/webauth/ WebAuth], [https://sourceforge.net/projects/mod-auth-sspi mod_auth_sspi] 等等。
+
本文档描述了如何在 Django 应用程序中使用外部身份验证源(Web 服务器在其中设置 <code>REMOTE_USER</code> 环境变量)。 此类身份验证解决方案通常出现在 Intranet 站点上,具有单点登录解决方案,例如 IIS 和集成 Windows 身份验证或 Apache 和 [https://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html mod_authnz_ldap][https://www.apereo.org/projects/cas CAS][http://weblogin.org Cosign] ]、[https://www.stanford.edu/services/webauth/ WebAuth][https://sourceforge.net/projects/mod-auth-sspi mod_auth_sspi]等。
  
当 Web 服务器负责鉴权时,通常会设置 <code>REMOTE_USER</code> 环境变量,这是为了在底层应用中使用。在 Django 中, <code>REMOTE_USER</code> 是作为 [[../../ref/request-response#django.http.HttpRequest|<code>request.META</code>]] 的参数来使用的。如果想在 Django 中使用 <code>REMOTE_USER</code>, 可以通过配置 <code>RemoteUserMiddleware</code> 中间件, <code>PersistentRemoteUserMiddleware</code> 中间件,或者继承在 [[../../topics/auth/index#module-django.contrib|<code>django.contrib.auth</code>]] 中的 [[../../ref/contrib/auth#django.contrib.auth.backends|<code>RemoteUserBackend</code>]] 来实现。
+
当 Web 服务器处理身份验证时,它通常会设置 <code>REMOTE_USER</code> 环境变量以在底层应用程序中使用。 在 Django 中,<code>REMOTE_USER</code> [[../../ref/request-response#django.http.HttpRequest|request.META]] 属性中可用。 Django 可以配置为使用 <code>RemoteUserMiddleware</code> <code>PersistentRemoteUserMiddleware</code> 以及 [[../../topics/auth/index#module-django.contrib|django.contrib 中的]] [[../../ref/contrib/auth#django.contrib.auth.backends|RemoteUserBackend]] 类来使用 <code>REMOTE_USER</code> 值。身份验证。
  
 
<div id="configuration" class="section">
 
<div id="configuration" class="section">
第11行: 第12行:
 
== 配置 ==
 
== 配置 ==
  
首先,你需要向配置文件的 [[../../ref/settings#std-setting-MIDDLEWARE|<code>MIDDLEWARE</code>]] 键中,在 [[../../ref/middleware#django.contrib.auth.middleware|<code>django.contrib.auth.middleware.AuthenticationMiddleware</code>]] 的 '''后面''' 添加 [[../../ref/middleware#django.contrib.auth.middleware|<code>django.contrib.auth.middleware.RemoteUserMiddleware</code>]]
+
首先,您必须将 [[../../ref/middleware#django.contrib.auth.middleware|django.contrib.auth.middleware.RemoteUserMiddleware]] 添加到 [[#id1|:setting:`MIDDLEWARE`]] 设置 之后 [[../../ref/middleware#django.contrib.auth.middleware|django.contrib .auth.middleware.AuthenticationMiddleware]]:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第17行: 第18行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>MIDDLEWARE = [
+
<syntaxhighlight lang="python">MIDDLEWARE = [
 
     '...',
 
     '...',
 
     'django.contrib.auth.middleware.AuthenticationMiddleware',
 
     'django.contrib.auth.middleware.AuthenticationMiddleware',
 
     'django.contrib.auth.middleware.RemoteUserMiddleware',
 
     'django.contrib.auth.middleware.RemoteUserMiddleware',
 
     '...',
 
     '...',
]</pre>
+
]</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
然后,你需要将设置中的 [[../../ref/settings#std-setting-AUTHENTICATION_BACKENDS|<code>AUTHENTICATION_BACKENDS</code>]] setting:: 键值由 [[../../ref/contrib/auth#django.contrib.auth.backends|<code>ModelBackend</code>]] 替换为 [[../../ref/contrib/auth#django.contrib.auth.backends|<code>RemoteUserBackend</code>]]:
+
接下来,您必须将 [[#id3|:setting:`AUTHENTICATION_BACKENDS`]] 设置中的 [[../../ref/contrib/auth#django.contrib.auth.backends|ModelBackend]] 替换为 [[../../ref/contrib/auth#django.contrib.auth.backends|RemoteUserBackend]]
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第33行: 第34行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>AUTHENTICATION_BACKENDS = [
+
<syntaxhighlight lang="python">AUTHENTICATION_BACKENDS = [
 
     'django.contrib.auth.backends.RemoteUserBackend',
 
     'django.contrib.auth.backends.RemoteUserBackend',
]</pre>
+
]</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
通过此项设置, <code>RemoteUserMiddleware</code> 可以检测 <code>request.META['REMOTE_USER']</code> 中的用户名,而且可以认证和自动登录用户使用的 [[../../ref/contrib/auth#django.contrib.auth.backends|<code>RemoteUserBackend</code>]]
+
通过此设置,<code>RemoteUserMiddleware</code> 将检测 <code>request.META['REMOTE_USER']</code> 中的用户名,并将使用 [[../../ref/contrib/auth#django.contrib.auth.backends|RemoteUserBackend]] 验证和自动登录该用户。
  
要注意这项设置将导致无法使用默认的 <code>ModelBackend</code> 验证。也就是说如果 <code>REMOTE_USER</code> 的值没有指定则该用户将无法登录,即使通过 Django 的管理后台。要解决这些问题,把 <code>'django.contrib.auth.backends.ModelBackend'</code> 加入 <code>AUTHENTICATION_BACKENDS</code> 列表中,则当 <code>REMOTE_USER</code> 未指定时,就会回退使用 <code>ModelBackend</code>
+
请注意,此特定设置禁用了默认 <code>ModelBackend</code> 的身份验证。 这意味着如果 <code>REMOTE_USER</code> 值未设置,则用户无法登录,即使使用 Django 的管理界面。 如果 <code>REMOTE_USER</code> 不存在,将 <code>'django.contrib.auth.backends.ModelBackend'</code> 添加到 <code>AUTHENTICATION_BACKENDS</code> 列表将使用 <code>ModelBackend</code> 作为后备,这将解决这些问题。
  
Django 的用户管理系统,比如 <code>contrib.admin</code> 中的视图函数及 [[../../ref/django-admin#django-admin-createsuperuser|<code>createsuperuser</code>]] 的管理命令,都没有与远程用户集成。这些接口只工作在数据库中存储的用户上,无论 <code>AUTHENTICATION_BACKENDS</code> 为何值。
+
Django 的用户管理,例如 <code>contrib.admin</code> [[#id5|:djadmin:`createsuperuser`]] 管理命令中的视图,没有与远程用户集成。 这些接口与存储在数据库中的用户一起工作,而不管 <code>AUTHENTICATION_BACKENDS</code>
  
 
<div class="admonition note">
 
<div class="admonition note">
  
注解
+
笔记
  
因为 <code>RemoteUserBackend</code> 继承自 <code>ModelBackend</code>, 您仍将拥有在 <code>ModelBackend</code> 中实现的所有相同的权限检查。
+
由于 <code>RemoteUserBackend</code> 继承自 <code>ModelBackend</code>,您仍将拥有在 <code>ModelBackend</code> 中实现的所有相同权限检查。
  
具有 [[../../ref/contrib/auth#django.contrib.auth.models.User|<code>is_active=False</code>]] 的用户将被禁止验证。你可以使用 [[../../ref/contrib/auth#django.contrib.auth.backends|<code>AllowAllUsersRemoteUserBackend</code>]] 来允许验证。
+
将不允许具有 [[../../ref/contrib/auth#django.contrib.auth.models.User|is_active=False]] 的用户进行身份验证。 如果你想允许他们使用 [[../../ref/contrib/auth#django.contrib.auth.backends|AllowAllUsersRemoteUserBackend]]
  
  
 
</div>
 
</div>
如果你的验证机制使用一个自定义的 HTTP header 而不是 <code>REMOTE_USER</code>,你可以构建一个 <code>RemoteUserMiddleWare</code> 的子类然后把 <code>header</code> 属性设成你希望的 <code>request.META</code> 键值。例如:
+
如果您的身份验证机制使用自定义 HTTP 标头而不是 <code>REMOTE_USER</code>,您可以子类化 <code>RemoteUserMiddleware</code> 并将 <code>header</code> 属性设置为所需的 <code>request.META</code> 键。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第62行: 第63行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>from django.contrib.auth.middleware import RemoteUserMiddleware
+
<syntaxhighlight lang="python">from django.contrib.auth.middleware import RemoteUserMiddleware
  
 
class CustomHeaderMiddleware(RemoteUserMiddleware):
 
class CustomHeaderMiddleware(RemoteUserMiddleware):
     header = 'HTTP_AUTHUSER'</pre>
+
     header = 'HTTP_AUTHUSER'</syntaxhighlight>
  
 
</div>
 
</div>
第74行: 第75行:
 
警告
 
警告
  
使用具有自定义HTTP头部的 <code>RemoteUserMiddleware</code> 子类时需要特别小心。你要确保你的前端服务器基于验证检查结果正确设置或去除了该头部,禁止任何终端用户提交一个仿冒的头部值。因为HTTP头部 <code>X-Auth-User</code> 与(比方说) <code>X-Auth_User</code> 都会标准化为 <code>request.META</code> <code>HTTP_X_AUTH_USER</code> 键,你必须确保你的服务器不允许头部使用下划线来替代横杠。
+
如果使用带有自定义 HTTP 标头的 <code>RemoteUserMiddleware</code> 子类,请务必小心。 您必须确保您的前端 Web 服务器始终根据适当的身份验证检查设置或删除该标头,决不允许最终用户提交虚假(或“欺骗”)标头值。 由于 HTTP 标头 <code>X-Auth-User</code> <code>X-Auth_User</code>(例如)都标准化为 <code>request.META</code> 中的 <code>HTTP_X_AUTH_USER</code> 键,您还必须检查您的 Web 服务器是否没有t 允许使用下划线代替破折号的欺骗标题。
  
这个警告不适用于 <code>RemoteUserMiddlewar</code>,它的默认配置为 <code>header ='REMOTE_USER'</code>, 因为在 <code>request.META</code> 中不存在以 <code>HTTP_</code> 开始的键可以只由WSGI服务器设置, 而不能直接来自HTTP请求头部.
+
此警告不适用于 <code>header = 'REMOTE_USER'</code> 的默认配置中的 <code>RemoteUserMiddleware</code>,因为在 <code>request.META</code> 中不以 <code>HTTP_</code> 开头的键只能是由您的 WSGI 服务器设置,而不是直接从 HTTP 请求标头设置。
  
  
 
</div>
 
</div>
如果你需要更多控制, 你可以通过继承 [[../../ref/contrib/auth#django.contrib.auth.backends|<code>RemoteUserBackend</code>]] 并且覆盖其一个或多个属性和方法来创建你自己的验证后端.
+
如果您需要更多控制,您可以创建自己的身份验证后端,该后端继承自 [[../../ref/contrib/auth#django.contrib.auth.backends|RemoteUserBackend]] 并覆盖其一个或多个属性和方法。
  
  
第87行: 第88行:
  
 
<span id="persistent-remote-user-middleware-howto"></span>
 
<span id="persistent-remote-user-middleware-howto"></span>
== 仅在登录界面使用 <code>REMOTE_USER</code> ==
+
== 仅在登录页面上使用 REMOTE_USER ==
  
<code>RemoteUserMiddleware</code> 这个认证中间件 ,它假设HTTP请求的头部 <code>REMOTE_USER</code> 在所有认证请求中都存在。这个假设在当通过 <code>htpasswd</code> 或者相似的认证机制来做Basic HTTP的认证时才是可行的,但是使用Negotiate (GSSAPI/Kerberos) 或者其它资源密集型的认证方法时就说不过去了,前端HTTP server的认证通常用在仅仅一个或不太多的登录URLs,而且在认证成功后,应用还要自己去维护这个session。
+
<code>RemoteUserMiddleware</code> 身份验证中间件假定 HTTP 请求标头 <code>REMOTE_USER</code> 与所有经过身份验证的请求一起存在。 当使用具有 <code>htpasswd</code> 或类似机制的基本 HTTP 身份验证或类似机制时,这可能是预期和实用的,但使用协商(GSSAPI/Kerberos)或其他资源密集型身份验证方法时,前端 HTTP 服务器中的身份验证通常只是设置一个或几个登录 URL,并且在成功验证后,应用程序应该自己维护经过验证的会话。
  
[[../../ref/middleware#django.contrib.auth.middleware|<code>PersistentRemoteUserMiddleware</code>]] 就针对这个使用场景提供了支持。除非用户显式地退出登录,它将一直保留已认证的会话。这个中间件可以代替上文中的 [[../../ref/middleware#django.contrib.auth.middleware|<code>RemoteUserMiddleware</code>]]
+
[[../../ref/middleware#django.contrib.auth.middleware|PersistentRemoteUserMiddleware]] 为这个用例提供支持。 它将保持经过身份验证的会话,直到用户明确注销。 该类可用作上述文档中 [[../../ref/middleware#django.contrib.auth.middleware|RemoteUserMiddleware]] 的替代品。
  
  
第97行: 第98行:
  
 
</div>
 
</div>
 +
<div class="clearer">
  
[[Category:Django 3.0.x 中文文档]]
+
 
 +
 
 +
</div>
 +
 
 +
[[Category:Django 3.0.x 文档]]

2021年10月31日 (日) 04:08的最新版本

使用 REMOTE_USER 进行身份验证

本文档描述了如何在 Django 应用程序中使用外部身份验证源(Web 服务器在其中设置 REMOTE_USER 环境变量)。 此类身份验证解决方案通常出现在 Intranet 站点上,具有单点登录解决方案,例如 IIS 和集成 Windows 身份验证或 Apache 和 mod_authnz_ldapCASCosign ]、WebAuthmod_auth_sspi等。

当 Web 服务器处理身份验证时,它通常会设置 REMOTE_USER 环境变量以在底层应用程序中使用。 在 Django 中,REMOTE_USERrequest.META 属性中可用。 Django 可以配置为使用 RemoteUserMiddlewarePersistentRemoteUserMiddleware 以及 django.contrib 中的 RemoteUserBackend 类来使用 REMOTE_USER 值。身份验证。

配置

首先,您必须将 django.contrib.auth.middleware.RemoteUserMiddleware 添加到 :setting:`MIDDLEWARE` 设置 之后 django.contrib .auth.middleware.AuthenticationMiddleware:

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

接下来,您必须将 :setting:`AUTHENTICATION_BACKENDS` 设置中的 ModelBackend 替换为 RemoteUserBackend

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.RemoteUserBackend',
]

通过此设置,RemoteUserMiddleware 将检测 request.META['REMOTE_USER'] 中的用户名,并将使用 RemoteUserBackend 验证和自动登录该用户。

请注意,此特定设置禁用了默认 ModelBackend 的身份验证。 这意味着如果 REMOTE_USER 值未设置,则用户无法登录,即使使用 Django 的管理界面。 如果 REMOTE_USER 不存在,将 'django.contrib.auth.backends.ModelBackend' 添加到 AUTHENTICATION_BACKENDS 列表将使用 ModelBackend 作为后备,这将解决这些问题。

Django 的用户管理,例如 contrib.admin:djadmin:`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'

警告

如果使用带有自定义 HTTP 标头的 RemoteUserMiddleware 子类,请务必小心。 您必须确保您的前端 Web 服务器始终根据适当的身份验证检查设置或删除该标头,决不允许最终用户提交虚假(或“欺骗”)标头值。 由于 HTTP 标头 X-Auth-UserX-Auth_User(例如)都标准化为 request.META 中的 HTTP_X_AUTH_USER 键,您还必须检查您的 Web 服务器是否没有t 允许使用下划线代替破折号的欺骗标题。

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


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


仅在登录页面上使用 REMOTE_USER

RemoteUserMiddleware 身份验证中间件假定 HTTP 请求标头 REMOTE_USER 与所有经过身份验证的请求一起存在。 当使用具有 htpasswd 或类似机制的基本 HTTP 身份验证或类似机制时,这可能是预期和实用的,但使用协商(GSSAPI/Kerberos)或其他资源密集型身份验证方法时,前端 HTTP 服务器中的身份验证通常只是设置一个或几个登录 URL,并且在成功验证后,应用程序应该自己维护经过验证的会话。

PersistentRemoteUserMiddleware 为这个用例提供支持。 它将保持经过身份验证的会话,直到用户明确注销。 该类可用作上述文档中 RemoteUserMiddleware 的替代品。