天天速看:drf重写authenticate方法实现多条件登录(源码分析)
JWT拓展的登录视图中, 在接受到用户名和密码时, 调用的也是Django的认证系统中提供的authenticate()来检查用户名与密码是否正确.
我们可以通过修改Django系统的认证后端来支持登录账号既可以是用户名也可以是手机号
(资料图片)
修改重写思路是:
修改Django认证系统的认证后端需要继承django.contrib.auth.backends.ModelBackends, 并重写authenticate方法我们需要重写什么位置?
因为我们的需求是多条件登录, 所以我们就应该着手于数据库校验操作, 寻找定位源码中数据库校验username是否存在的操作, 并使用Q查询添加多个条件验证2. 源码分析下面是以from rest_framework_jwt.views import obtain_jwt_token为入口进行的源码分析(序号为查找流程):
继承JsonWebTokenAPIView视图, 当接受到用户post请求时, 执行get_serializer()
调用get_serializer()方法找到子类中定义的serializer类
当调用is_valid()方法时, 会调用到validate()
这里调用了authenticate方法并传入了用户数据, 返回的对象user
authenticate方法中调用了_get_backneds()方法, 此方法中将配置文件AUTHENTICATION_BACKENDS读取, 这个是django默认的配置, 我们重写方法之后, 需要将我们的类也配置到这里django的默认配置文件路径 django>conf>global_settings.py>AUTHENTICATION_BACKENDS读取了配置文件之后调用到了ModelBackend中的authenticate方法authenticate方法获取username携带username进行查表操作, 返回user对象如果查到user,就去验证其密码的正确性所以我们就可以重写的ModelBackend中的authenticate方法(修改数据库操作)3. 代码实现在utils/authenticate.py中:
from django.contrib.auth.backends import ModelBackend, UserModelfrom django.db.models import Qdef get_user_by_account(account): """ 根据帐号信息获取user模型实例对象 :param account: 账号信息,可以是用户名,也可以是手机号,甚至其他的可用于识别用户身份的字段信息 :return: User对象 或者 None """ user = UserModel.objects.filter(Q(mobile=account) | Q(username=account) | Q(email=account)).first() return userclass CustomAuthBackend(ModelBackend): """ 自定义用户认证类[实现多条件登录] """ def authenticate(self, request, username=None, password=None, **kwargs): """ 多条件认证方法 :param request: 本次客户端的http请求对象 :param username: 本次客户端提交的用户信息,可以是user,也可以mobile或其他唯一字段 :param password: 本次客户端提交的用户密码 :param kwargs: 额外参数 :return: """ if username is None: username = kwargs.get(UserModel.USERNAME_FIELD) if username is None or password is None: return # 根据用户名信息useranme获取账户信息 user = get_user_by_account(username) if user and user.check_password(password) and self.user_can_authenticate(user): return user在配置文件settings/dev.py中告知Django使用我们自定义的认证后端,注意不是给drf添加设置。
# django自定义认证AUTHENTICATION_BACKENDS = ["luffycityapi.utils.authenticate.CustomAuthBackend", ] 关键词:
-
天天速看:drf重写authenticate方法实现多条件登录(源码分析)
2023-05-11 -
世界微速讯:鲁滨逊漂流记的写作背景概括_鲁滨逊漂流记 的写作背景
2023-05-11 -
世界通讯!“大明故事我开讲”昌平区讲故事大赛正式启动
2023-05-10 -
虞姬的哥哥虞子期 虞子期
2023-05-10 -
快讯:《无双》班底为发哥量身打造“浪子回头”情感大片 《别叫我“赌神”》定档 6 月 21 日
2023-05-10 -
嘉元科技拟与吴鹏设立深圳嘉元新能源科技有限公司 新公司注册资本1亿 公司持股90%-每日速递
2023-05-10 -
东兴兴盈三个月定开债基年内首次分红-通讯
2023-05-10 -
欲收购期货交易软件龙头91%股权?百亿A股公司回应|环球快播
2023-05-10 -
全球播报:中视传媒: 中视传媒股份有限公司股票交易风险提示公告
2023-05-10 -
圣农发展:4月销售收入14.4亿元 同比增长12.71%_当前速读
2023-05-10 -
“空中”草莓、鱼菜共生…… 外国网红揭开商丘夏邑智慧农业神秘面纱(视频)_焦点热文
2023-05-10 -
筑牢品质高地 盈峰环境打造国内首个环卫行业全场景试验基地
2023-05-10 -
龙虎榜 | 鸿博股份今日涨1.02% 4家机构专用席位净买入1.35亿元 最新资讯
2023-05-10 -
常州长江森林音乐节地址在哪里?(2023年)
2023-05-10 -
历史读物出现“丁汝昌投降图”?出版社致歉:全面收回销毁_世界热门
2023-05-10 -
火炬之光无限可以挂机吗 自动打怪挂机设置教程[多图]
2023-05-10 -
甘薯拌饭的正确做法步骤 甘薯拌饭的做法
2023-05-10 -
中置发动机跑车的巅峰之作:保时捷718 Spyder RS启动预售
2023-05-10 -
金华婺城区健康证在哪里办理? 当前观点
2023-05-10 -
5.20遇上周六 广州婚姻登记机关将全天对外办公
2023-05-10 -
世界焦点!齐齐哈尔市梅里斯区市监局为企业协调办理知识产权融资
2023-05-10 -
cpa缴费系统登录入口 天天观点
2023-05-10 -
午评:倒车接人 还是倒人碾人?
2023-05-10 -
2023年四川高考报名费用正式公布
2023-05-10 -
民警前来勘查 小偷现场“吃瓜” 自投罗网沦为“小丑”_环球热头条
2023-05-10 -
环球快播:反食品浪费!江夏公布16起典型案例
2023-05-10 -
北青:李海新将执法京津德比 上海德比海港进球因其误判角球 天天快讯
2023-05-10 -
聚灿光电完成工商变更登记并换发营业执照-天天信息
2023-05-10 -
内娱选秀团全没了?肖战那个团还在|全球观速讯
2023-05-10 -
百度智能云与14家文心千帆生态伙伴举行签约仪式_今日讯
2023-05-10
-
守住网络直播的伦理底线
2021-12-16 -
石窟寺文化需要基于保护的“新开发”
2021-12-16 -
电影工作者不能远离生活
2021-12-16 -
提升隧道安全管控能力 智慧高速让司乘安心
2021-12-16 -
人民财评:提升消费体验,服务同样重要
2021-12-16 -
卫冕?突破?旗手?——武大靖留给北京冬奥会三大悬念
2021-12-16 -
新能源车险专属条款出台“三电”系统、起火燃烧等都可保
2021-12-16 -
美术作品中的党史 | 第97集《窗外》
2021-12-16 -
基金销售业务违规!浦发银行厦门分行等被厦门证监局责令改正
2021-12-16 -
保持稳定发展有支撑——从11月“成绩单”看中国经济走势
2021-12-16