django AUTHENTICATION_CLASSES 运行 什么时候做中间件
When do django AUTHENTICATION_CLASSES run with respect to Middleware
我看到有一个 django.contrib.auth.middleware.AuthenticationMiddleware
但阅读文档我认为它不能确定什么时候 auth 实际上是 auth 是 运行。 auth 发生在中间件之前还是之后?可以更改该顺序吗?
不幸的是,身份验证过程和 AuthenticationMiddleware 彼此关系不大。身份验证作为一个过程是验证凭据的做法。为了不必为每个请求都这样做,可以创建一个“登录会话”,它将浏览器与过去发生的身份验证过程相关联。对于最终用户来说,这是透明的“登录过程”。这会导致“登录用户”并且 AuthenticationMiddleware 将此登录用户作为 request.user
放在请求对象上,或者如果没有发生登录过程,则 AnonymousUser
.
在 Django 中,身份验证由调用 django.contrib.auth.authenticate
完成,登录过程由 django.contrib.auth.login
完成。在 vanilla 安装中,这是由 django.contrib.auth.views.LoginView
完成的,它没有连接到任何 url,除了管理员登录。
身份验证后端不是中间件。它们是 authenticate
函数查询的身份验证数据的真实来源。它的列表按照设置定义的顺序执行,第一个 returns True
获胜。
我认为过去的目的是让身份验证中间件做更多的事情,但就目前而言,更好的名字是 CurrentUserMiddleware
。
无固定地点
您似乎认为有一个地方会在每个请求上调用身份验证后端。情况并非如此,但根据身份验证方法,它可以。例如,Django Rest Framework 的 token 认证在每个请求上发送一个 token header,在视图中每次都进行认证。
理论上,可以创建一个中间件,每次都对经过身份验证的用户进行身份验证和设置,尤其是使用基于令牌的身份验证时,因为它们会随每个请求发送凭据。这只是不切实际,因为从流程中排除意见变得更加困难和不明确。
我看到有一个 django.contrib.auth.middleware.AuthenticationMiddleware
但阅读文档我认为它不能确定什么时候 auth 实际上是 auth 是 运行。 auth 发生在中间件之前还是之后?可以更改该顺序吗?
不幸的是,身份验证过程和 AuthenticationMiddleware 彼此关系不大。身份验证作为一个过程是验证凭据的做法。为了不必为每个请求都这样做,可以创建一个“登录会话”,它将浏览器与过去发生的身份验证过程相关联。对于最终用户来说,这是透明的“登录过程”。这会导致“登录用户”并且 AuthenticationMiddleware 将此登录用户作为 request.user
放在请求对象上,或者如果没有发生登录过程,则 AnonymousUser
.
在 Django 中,身份验证由调用 django.contrib.auth.authenticate
完成,登录过程由 django.contrib.auth.login
完成。在 vanilla 安装中,这是由 django.contrib.auth.views.LoginView
完成的,它没有连接到任何 url,除了管理员登录。
身份验证后端不是中间件。它们是 authenticate
函数查询的身份验证数据的真实来源。它的列表按照设置定义的顺序执行,第一个 returns True
获胜。
我认为过去的目的是让身份验证中间件做更多的事情,但就目前而言,更好的名字是 CurrentUserMiddleware
。
无固定地点
您似乎认为有一个地方会在每个请求上调用身份验证后端。情况并非如此,但根据身份验证方法,它可以。例如,Django Rest Framework 的 token 认证在每个请求上发送一个 token header,在视图中每次都进行认证。
理论上,可以创建一个中间件,每次都对经过身份验证的用户进行身份验证和设置,尤其是使用基于令牌的身份验证时,因为它们会随每个请求发送凭据。这只是不切实际,因为从流程中排除意见变得更加困难和不明确。