diff --git a/src/DjangoBlog-master/accounts/user_login_backend.py b/src/DjangoBlog-master/accounts/user_login_backend.py index 73cdca1..65a0a4a 100644 --- a/src/DjangoBlog-master/accounts/user_login_backend.py +++ b/src/DjangoBlog-master/accounts/user_login_backend.py @@ -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