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,在视图中每次都进行认证。

理论上,可以创建一个中间件,每次都对经过身份验证的用户进行身份验证和设置,尤其是使用基于令牌的身份验证时,因为它们会随每个请求发送凭据。这只是不切实际,因为从流程中排除意见变得更加困难和不明确。