Update user_login_backend.py

master
p9xvr8cjz 1 month ago
parent 30b4684649
commit c69960ebca

@ -4,23 +4,69 @@ from django.contrib.auth.backends import ModelBackend
class EmailOrUsernameModelBackend(ModelBackend):
"""
允许使用用户名或邮箱登录
自定义用户认证后端
扩展Django默认认证支持使用邮箱或用户名登录
继承自ModelBackend重写authenticate方法实现多字段登录
Django默认只支持用户名登录这个后端增加了邮箱登录支持
"""
def authenticate(self, request, username=None, password=None, **kwargs):
"""
用户认证核心方法
根据输入判断是邮箱还是用户名然后进行密码验证
Args:
request: HttpRequest对象包含请求信息
username (str): 用户输入的用户名或邮箱
password (str): 用户输入的密码
**kwargs: 其他可能的参数
Returns:
User: 认证成功返回用户对象
None: 认证失败返回None
Logic:
1. 判断输入是否包含@符号 邮箱登录
2. 不包含@符号 用户名登录
3. 查询数据库获取用户
4. 验证密码是否正确
"""
#ZXY: 步骤1判断登录方式邮箱 or 用户名)
if '@' in username:
kwargs = {'email': username}
#ZXY: 输入包含@符号,认为是邮箱登录
kwargs = {'email': username} #ZXY: 构建邮箱查询条件
else:
kwargs = {'username': username}
#ZXY: 输入不包含@符号,认为是用户名登录
kwargs = {'username': username} #ZXY: 构建用户名查询条件
try:
#ZXY: 步骤2根据查询条件获取用户对象
#ZXY: get_user_model() 获取项目中使用的用户模型
user = get_user_model().objects.get(**kwargs)
#ZXY: 步骤3验证密码
#ZXY: check_password() 方法会自动处理密码哈希比较
if user.check_password(password):
return user
return user #ZXY: 密码正确,返回用户对象
except get_user_model().DoesNotExist:
#ZXY: 用户不存在返回None表示认证失败
return None
def get_user(self, username):
"""
根据用户ID获取用户对象
用于session认证时从数据库加载用户信息
Args:
username (str): 实际上是用户IDDjango的命名历史遗留
Returns:
User: 用户对象
None: 用户不存在
"""
try:
#ZXY: 根据主键用户ID获取用户对象
return get_user_model().objects.get(pk=username)
except get_user_model().DoesNotExist:
return None

Loading…
Cancel
Save