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
我已添加AUTHENTICATION_BACKENDS = ['GeneralApp.utils.EmailBackend']
到settings.py 中,当它被评论时,我可以使用用户名登录,当我取消评论时,我无法再登录。我发现 的代码GeneralApp.utils.EmailBackend.authenticate()
从未执行过,但我知道 Django 可以找到该类,因为我故意拼错了它并且出现错误,并且当我更正错字时,不会引发异常。我也知道默认的身份验证后端被有效地覆盖,因为我既不能使用用户名登录。我有同样的解决方案在另一个项目中完美地工作,所以我不明白为什么当类完全定位并AUTHENTICATION_BACKENDS
设置为它时,自定义身份验证代码永远不会执行。
解决方案
好的,我以前用 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
推荐阅读
- excel - 通过 VBA 使用 Selenium 单击“连接”按钮时出现“不允许您请求的操作”错误
- graphql - 如何重塑 GraphQL(通过 Hasura)查询响应?
- networking - 傀儡大师不允许签署傀儡代理证书请求,说“无法解析 xxxx:没有 xxxx 的名称
- javascript - 压缩多个 IF 语句
- sql - 通过不返回聚合列的行值进行 SQL 分组
- spring-boot - 如何在 Google App Engine 环境中为 Springboot 应用程序获取更新的(测试)对象值?
- android - Android Pjsip视频通话:视频通话结束后,应用突然崩溃
- python - 在 Python API Scraper 中旋转代理线程
- angular - 使用 tooltip-append-to-body 后可以更改工具提示大小
- reactjs - 如何用另一个覆盖反应模式