首页 > 解决方案 > 自定义电子邮件身份验证后端在 django 2.1.4 中不起作用

问题描述

我在将自定义身份验证后端集成到django 2.1.4. 以下是我的代码:
我的FMS.authBackend模块:

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

class authEmailBackend(ModelBackend):
    def authenticate(self, username=None, password=None, **kwargs):
        print("aaaaaaa")
        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

我的settings.py

AUTHENTICATION_BACKENDS = (
                'FMS.authBackend.authEmailBackend',
                'django.contrib.auth.backends.ModelBackend',

                )

我的urls.py

from django.contrib.auth import views as auth_views
urlpatterns = [ 
        path('login', my_decos.logout_required(auth_views.LoginView.as_view(template_name = 'register/login.html')),name = 'login')
]

上面的代码在我的情况下不起作用。函数authenticateinauthEmailBackend永远不会被调用,因为控制台中没有打印任何内容,但我在authenticate函数中打印语句。

虽然相同的代码适用django 2.0.8,但唯一的区别urls.py是:

from django.contrib.auth import views as auth_views
urlpatterns = [ 
        path('login', my_decos.logout_required(auth_views.login(template_name = 'register/login.html')),name = 'login')
]

但在较新的 djangodjango.contrib.auth.views.login中不再支持,我们需要使用django.contrib.auth.views.LoginView. 我在某处读到使用自定义AUTHENTICATION_BACKEND我们的 url 必须指向的地方,django.contrib.auth.views.login但这在这里是不可能的。

所以你能帮我解决这个问题吗?

标签: pythondjangodjango-authenticationdjango-login

解决方案


请求参数需要传递给 authenticate 方法

  class authEmailBackend(ModelBackend):
        **def authenticate(self, request, username=None, password=None, **kwargs):**
            print("aaaaaaa")
            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

推荐阅读