首页 > 解决方案 > Django 自定义身份验证后端不起作用

问题描述

我希望我的 Django 项目使用他们的电子邮件而不是用户名来验证用户。我遵循了这个建议,但它不起作用。

这是我的EmailBackend

from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend

class EmailBackend(ModelBackend):
    def authenticate(self, username=None, password=None, **kwars):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(email=username)
        except UserModel.DoesNotExist:
            return None
        else:
            if user.check_password(password):
                return user

        return None

我已添加AUTHENTICATION_BACKENDS = ['GeneralApp.utils.EmailBackend']settings.py 中,当它被评论时,我可以使用用户名登录,当我取消评论时,我无法再登录。我发现 的代码GeneralApp.utils.EmailBackend.authenticate()从未执行过,但我知道 Django 可以找到该类,因为我故意拼错了它并且出现错误,并且当我更正错字时,不会引发异常。我也知道默认的身份验证后端被有效地覆盖,因为我既不能使用用户名登录。我有同样的解决方案在另一个项目中完美地工作,所以我不明白为什么当类完全定位并AUTHENTICATION_BACKENDS设置为它时,自定义身份验证代码永远不会执行。

标签: pythondjango

解决方案


好的,我以前用 Django 2.0.5 尝试过这个,但它停止与 Django 2.1 一起工作。我在这里进行了研究,发现自定义身份验证后端类现在需要方法authenticate中的参数请求。所以 Django 2.1 的最终代码是:

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwars):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(email=username)
        except UserModel.DoesNotExist:
            return None
        else:
            if user.check_password(password):
                return user

        return None

推荐阅读