Django多字段认证的实现
Django多字段认证
需求:
django认证的检查用户是username,如果使用 username和 手机号验证登录。
重写:
ModelBackend
类下的 authenticate 方法
# 在对应应用下创建 utils.py
""" 修改Django认证类,为了实现 username和手机号登录 """
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from .models import User
def get_user_by_account(account):
"""
通过传入的账号动态获取 user 模型对象
:param account: 有可能是手机号,有可能是用户名
:return: 返回user对象或None
"""
try:
# Q查询 |:或; &:与; ~:非;
user = User.objects.get(Q(username=account) | Q(mobile=account))
except User.DoesNotExist as e:
logger.error(f"No user found with account: {account}. Error: {e}")
return None
else:
# 这里返回的是 User 模型的一个实例(即一个用户对象),不是 User 模型类本身。
return user
class UsernameModelAuthBackend(ModelBackend):
# 重写 ModelBackend类下的 authenticate 方法
def authenticate(self, request, username=None, password=None, **kwargs):
# 获取user
user = get_user_by_account(account=username)
# 判断前端传入的密码是否正确
if user and user.check_password(password):
logger.info(f'{user} ,authentication is successful ')
# 返回user
return user
# 如果没有找到用户或密码不正确,返回 None
logger.warning("Authentication failed: either the user does not exist or the password is incorrect.")
return None
修改setting.py
# setting.py
""" 修改django认证后端类 """
# django认证的检查用户是username, 默认是 django.contrib.auth.backends.ModelBackend
# AUTHENTICATION_BACKENDS = ["django.contrib.auth.backends.ModelBackend"]
# 修改为自定义的用户验证类, 它也继承了 ModelBackend, 导包
AUTHENTICATION_BACKENDS = ['users.utils.UsernameModelAuthBackend']