ADD file via upload

lm_branch
pjf284zq7 5 months ago
parent 1a1b24520a
commit a9dd8d190f

@ -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
Loading…
Cancel
Save