|
|
|
|
@ -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): 实际上是用户ID(Django的命名历史遗留)
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
User: 用户对象
|
|
|
|
|
None: 用户不存在
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
#ZXY: 根据主键(用户ID)获取用户对象
|
|
|
|
|
return get_user_model().objects.get(pk=username)
|
|
|
|
|
except get_user_model().DoesNotExist:
|
|
|
|
|
return None
|
|
|
|
|
|