Django自定义身份验证后端不起作用

HuL*_*iCa 4 python 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
Run Code Online (Sandbox Code Playgroud)

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

HuL*_*iCa 17

好吧,我之前尝试过使用Django 2.0.5,但它已停止使用Django 2.1.我在这里研究并发现自定义身份验证后端类现在需要在方法身份验证中使用参数请求.所以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
Run Code Online (Sandbox Code Playgroud)


Mbe*_*reL 5

在 Django 3.x 中工作

自定义身份验证文件如下所示:

from django.contrib.auth import get_user_model


User = get_user_model()


class EmailAuthBackend(object):
    """It provides the functionality to slide down to email to login,
    instead of just username"""
    def authenticate(self,request,username=None,password=None):
        try:
            user = User.objects.get(email=username)
            if user.check_password(password):   #you can also test user.is_active
                return user 
            return None
        except User.DoesNotExist:
            return None

    def get_user(self,user_id):
        try:
            return User.objects.get(id=user_id)
        except User.DoesNotExist:
            return None
Run Code Online (Sandbox Code Playgroud)

在settings.py中我们需要输入:

#Custom Authentication Backend
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'path_to_custom_backend.EmailAuthBackend',
]
Run Code Online (Sandbox Code Playgroud)