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

时间:2017-09-18 05:54:55

标签: python django authentication

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

这可能吗?怎么样?

1 个答案:

答案 0 :(得分:4)

Django docs for authentication backends settings中所述:

  

一旦用户进行了身份验证,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

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