在 Django 中,登录后如何检测哪个身份验证后端对用户进行了身份验证?

zaa*_*deh 5 python authentication django

我试图在我的视图中区分几个 Django 身份验证后端(它们是外部包,我最好不想修改它们)。django.contrib.authdocs 说 auth backends ( settings.AUTHENTICATION_BACKENDS) 将按顺序尝试,第一个进行身份验证的将返回并设置request.user,如果有任何引发异常,则拒绝身份验证。但它没有说明如何根据哪个后端对用户进行身份验证来区分请求。

这可能吗?如何?

Ant*_*ane 7

正如Django 文档中关于身份验证后端设置的解释

用户通过身份验证后,Django 存储用于在用户会话中对用户进行身份验证的后端,并在需要访问当前身份验证的用户时在该会话期间重新使用相同的后端。这实际上意味着身份验证源在每个会话的基础上进行缓存

实际上,在使用函数时会存储此信息login(request, user, backend=None)(请参阅 参考资料django.contrib.auth.__init__.py)。用户通过身份验证后,将存储以下会话信息:

SESSION_KEY = '_auth_user_id'
BACKEND_SESSION_KEY = '_auth_user_backend'
HASH_SESSION_KEY = '_auth_user_hash'
# [...]
request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
request.session[BACKEND_SESSION_KEY] = backend
request.session[HASH_SESSION_KEY] = session_auth_hash
Run Code Online (Sandbox Code Playgroud)

因此,您应该检查当前请求的会话BACKEND_SESSION_KEY以查找用于验证用户身份的后端。