|
|
|
|
@ -0,0 +1,57 @@
|
|
|
|
|
#lm 自定义认证后端模块
|
|
|
|
|
#lm 功能:实现支持用户名或邮箱登录的自定义认证逻辑
|
|
|
|
|
#lm 扩展Django默认认证方式,提供更灵活的用户身份验证
|
|
|
|
|
|
|
|
|
|
# 导入Django的用户模型工具,用于获取项目配置的用户模型(支持自定义用户模型)
|
|
|
|
|
from django.contrib.auth import get_user_model
|
|
|
|
|
# 导入Django内置的模型认证后端基类,用于扩展自定义认证逻辑
|
|
|
|
|
from django.contrib.auth.backends import ModelBackend
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EmailOrUsernameModelBackend(ModelBackend):
|
|
|
|
|
"""
|
|
|
|
|
自定义认证后端,继承自Django的ModelBackend
|
|
|
|
|
功能:允许用户使用用户名或邮箱地址进行登录验证
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def authenticate(self, request, username=None, password=None, **kwargs):
|
|
|
|
|
"""
|
|
|
|
|
重写认证方法,实现用户名/邮箱登录逻辑
|
|
|
|
|
:param request: 请求对象
|
|
|
|
|
:param username: 登录时输入的标识(可能是用户名或邮箱)
|
|
|
|
|
:param password: 登录密码
|
|
|
|
|
:param kwargs: 其他关键字参数
|
|
|
|
|
:return: 验证成功返回用户对象,失败返回None
|
|
|
|
|
"""
|
|
|
|
|
#lm 判断输入的"username"是否包含@符号,若包含则视为邮箱登录
|
|
|
|
|
if '@' in username:
|
|
|
|
|
#lm 构建查询条件:使用email字段匹配
|
|
|
|
|
kwargs = {'email': username}
|
|
|
|
|
else:
|
|
|
|
|
#lm 否则视为用户名登录,构建查询条件:使用username字段匹配
|
|
|
|
|
kwargs = {'username': username}
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
#lm 根据构建的条件查询用户(使用项目配置的用户模型)
|
|
|
|
|
user = get_user_model().objects.get(**kwargs)
|
|
|
|
|
#lm 验证查询到的用户密码是否正确(Django内置的密码校验,自动处理哈希对比)
|
|
|
|
|
if user.check_password(password):
|
|
|
|
|
#lm 密码正确,返回用户对象
|
|
|
|
|
return user
|
|
|
|
|
except get_user_model().DoesNotExist:
|
|
|
|
|
#lm 若用户不存在(查询失败),返回None表示认证失败
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def get_user(self, username):
|
|
|
|
|
"""
|
|
|
|
|
重写获取用户的方法,根据用户主键获取用户对象
|
|
|
|
|
(Django认证系统会调用此方法获取已认证用户的详细信息)
|
|
|
|
|
:param username: 实际为用户的主键(pk)
|
|
|
|
|
:return: 存在则返回用户对象,不存在返回None
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
#lm 根据主键查询用户
|
|
|
|
|
return get_user_model().objects.get(pk=username)
|
|
|
|
|
except get_user_model().DoesNotExist:
|
|
|
|
|
#lm 用户不存在,返回None
|
|
|
|
|
return None
|