从 backend.get_user 访问 request.session

Posted

技术标签:

【中文标题】从 backend.get_user 访问 request.session【英文标题】:Access request.session from backend.get_user 【发布时间】:2010-11-08 15:52:12 【问题描述】:

首先:这与this 相同。 ModelBackend 没有request 成员。

我想访问当前用户的会话而不访问全局请求对象或他/她的会话 ID。

为什么?我编写了自己的身份验证后端,扩展了ModelBackend。我有函数get_user (self, user_id),每个请求都会调用它(这是由Django auth 中间件自动完成的)。不幸的是,get_user 无权访问request,但在我的情况下,我想检查会话中的数据(为什么又要检查一次?因为我没有本地数据库并从远程中间件获取所有数据. 会话将是一种进行某种缓存的舒适方式。

【问题讨论】:

【参考方案1】:

RemoteUserBackend(来自django.contrib.auth.backends)使用特殊的中间件RemoteUserMiddleware 来访问请求数据。也许你也可以这样做。

【讨论】:

抱歉,我知道这是一个旧线程,但我正在查看引用的代码,但我看不到它在哪里访问我刚刚认证的用户的请求数据。 @RonSmith 我已经稍微更新了链接。诀窍是一切都由RemoteUserMiddleware.process_request 完成——它通过了request 对象(middleware.py#L40)。它检查Remote-User HTTP 标头(L50)是否存在,如果存在,则将该数据传递给RemoteUserBackend.authenticate(L73)并将结果保存在request(L77)中。在这种情况下,只有 HTTP 标头的值是 passeb,但想法是,如果您需要身份验证后端中的会话信息,您可以从中间件抢先将其存储在那里。 您介意以几行代码为例更新您的答案吗?谢谢。【参考方案2】:

您也可以在调用authenticate 函数的任何时候将“请求”参数传递给它:

def authenticate(self, request, **kwargs):
    ....

【讨论】:

问题是get_user函数,没有authenticate(..) 我仍然发现答案很有用,因为我在身份验证期间需要它。【参考方案3】:

您可以使用小号ThreadLocalMiddleware。它使请求对象随处可用。

from django_tools.middlewares import ThreadLocal

request = ThreadLocal.get_current_request()
# request.session <-- is now available

不要忘记将中间件添加到 settings.py 的 MIDDLEWARE_CLASSES 元组中:

MIDDLEWARE_CLASSES = (
    ...
    'django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware',
    ...
)

【讨论】:

以上是关于从 backend.get_user 访问 request.session的主要内容,如果未能解决你的问题,请参考以下文章

如何从 socket.io 中访问 req.session 变量?

express-jwt 无法从路由目录访问 req.user

Passport.js、会话和反应 |从 /login 路由以外的任何路由访问 req.user 是未定义的

NestJS - 从 Guard 访问用户

从 json 正文访问键的值

从 Jade 模板访问 Express.js 请求或会话