基于状态的Django多重认证后端

时间:2013-04-20 03:27:32

标签: django django-models python-2.7 django-admin django-authentication

我想知道如何告诉Django根据用户是否标记为工作人员或不是用户而使用哪个身份验证后端。

可以这样做吗?

2 个答案:

答案 0 :(得分:7)

由于Django使用身份验证后端来获取用户对象,因此在我们调用后端时不知道用户是否会将其标记为人员。

Specifying authentication backends中所述,通过链接后端仍然可以为员工和非员工用户使用不同的后端。例如,如果您的设置是:

 AUTHENTICATION_BACKEND = (
     'myapp.auth.StaffUserBackend',
     'django.contrib.auth.backends.ModelBackend',
 )

其中myapp.auth.StaffUserBackend仅识别员工用户,这将在用户进行身份验证时发生:

  • 根据StaffUserBackend检查凭据。
  • 如果用户是员工且凭据正确,StaffUserBackend将返回用户对象,我们就完成了。
  • 如果用户不是员工,则会根据ModelBackend检查凭据。
  • 如果凭据对标准用户有效,ModelBackend将返回User对象,并且照常对用户进行身份验证。
  • 如果任何后端不接受凭据,则身份验证将失败。

答案 1 :(得分:0)

随着Django一个接一个地运行所有后端。你可以做的是使用views.py文件中的authenticate函数。

例如,您需要检查员工用户

email = form.cleaned_data['email']
try:
    name = StaffUser.objects.get(email=email)
except StaffUser.DoesNotExist:
    return "Do whatever you want"
user = authenticate(username=form.cleaned_data['email'], password=form.cleaned_data['password'])

在此,只有当用户存在时才会调用您的认证功能。

这是一种粗略的想法,根据您的方便使用它。