我试图在我的视图中区分几个Django身份验证后端(外部包,我最好不想修改它们)。 django.contrib.auth
文档表示将按顺序尝试auth后端(settings.AUTHENTICATION_BACKENDS
),并且第一个进行身份验证的人将返回并设置request.user
,如果有任何异常,则会拒绝身份验证。但它没有说明如何根据哪个后端验证用户来区分请求。
这可能吗?怎么样?
答案 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
的会话,以找到用于对用户进行身份验证的后端。