drf重写authenticate方法实现多条件登录(源码分析)
drf重写authenticate方法实现多条件登录(源码分析)
1. 思路
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, UserModel
from django.db.models import Q
def 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 user
class 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方法实现多条件登录(源码分析)的更多相关文章
- drf-day3——drf整体流程、APIView执行流程及源码分析、Request对象源码分析、序列化器介绍和使用、反序列化的使用、反序列化的校验
目录 一.drf 整体内容 二.APIView执行流程--源码分析(难,了解) 2.1 基于APIView+JsonResponse编写接口 2.2 基于APIView+Response 写接口 2. ...
- Django框架之drf:5、反序列化器校验部分源码分析、断言、drf之请求与响应、视图组件介绍及两个视图基类、代码部分实战
Django框架之drf 目录 Django框架之drf 一.反序列化类校验部分源码解析 二.断言 三.drf之请求 1.Request能够解析的前端传入编码格式 2.Request类中的属性和方法 ...
- jQuery原型方法first,last,eq,slice源码分析
这4个方法中前3个方法很常用大家都见过,但是slice方法可能会以为是数组方法,其实slice也是jQuery的一个原型方法,只不过是底层方法是为其他方法服务的(更具体点是为eq方法服务的),首先还是 ...
- Django drf:cbv(class base view)源码分析
cbv是基于类的视图 # 首先要在路由层配置: # 找到类绑定方法as_view # 点开dispatch的方法 # http_method_names其实就是方法的列表 整个流程: 1.写一个基于类 ...
- Django框架之drf:8、断点调试,权限、认证、频率组件源码分析,基于APIView编写分页,异常处理
Django框架之drf 一.断点调式使用 指,在我们编写代码的时候,程序运行出现报错是无可避免的,当程序 出现报错时,我们需要找到出现报错的代码进行修改,如果时简短的代码很容易就可以找到报错位置 ...
- Django(63)drf权限源码分析与自定义权限
前言 上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问 权限源码分析 源码入口:APIView.py文件下的initial方法下的check_per ...
- Django drf:认证及组件、token、局部钩子源码分析
一.drf认证功能 二.token讲解 三.局部钩子源码分析 一.drf认证功能 1.认证简介: 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录则不能查 ...
- DRF cbv源码分析 restful规范10条 drf:APIView的源码 Request的源码 postman的安装和使用
CBV 执行流程 路由配置:url(r'^test/',views.Test.as_view()), --> 根据路由匹配,一旦成功,会执行后面函数(request) --> 本质就是执 ...
- Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)
一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...
- drf 简介以及部分源码分析
目录 复习 drf框架 全称:django-rest framework 知识点 接口 restful接口规范 基于restful规范的原生Django接口 主路由:url.py api组件的子路由: ...
随机推荐
- bug单建单规范
bug提单保证,清晰.简单.明了. 标题: [版本][服务器][模块][必现/偶现]bug标题(最短的话描述bug) 例:[0.9.0][dev][系统][必现]点击商店,跳转到仓库页面 bug模 ...
- MyCat中间件的坑
首先说一下为什么选择MyCat,mysql分表分库的工具还有sharding-jdbc,是jar包的形式集成到项目的,可以相对灵活的配置自定义分片策略(PS:其实大部分业务场景是分片策略越简单越好啊, ...
- LaTeX in 24 Hours - 书籍信息
书籍信息 书名: LaTex in 24 Hours: A Practical Guide for Scientific Writing 作者: Dilip Datta 出版日期: 2017 ISBN ...
- ImageUtils excel 中 emf 转图片(解决图片上部分显示不全问题)图片转文字
excel 中ActiveX 工具 中的textbox ,以及公式 解析后为emf 图片, emf 转图片(解决图片上部分显示不全问题) 图片转文字 /*********************** ...
- SpringBoot笔记--事件监听+启动流程+监控+项目部署
事件监听 ApplicationContextInitializer SpringApplicationRunListener ApplicationRunner CommandLineRunner ...
- Github Copilot 比在座各位更会写代码。jpg
之前大佬和我安利过 Copilot, 作为一个能用就行的践行者, 我一贯对这些东西都不太感兴趣. 就如我多年VS Code写各种编程语言, jetbrains 全家桶我都懒得搞~ 不过最近看到过Cha ...
- 领域驱动设计DDD应用与最佳实践
领域驱动设计(Domain Driven Design,简称:DDD)设计思想和方法论早在2005年时候就被提出来,但是一直没有重视和推荐使用,直到2015年之后微服务流行之后,再次被人重视和推荐使用 ...
- sqlmap的基本使用
sqlmap的基本使用 一.注入 1.查询是否存在注入点 sqlmap -u "http://www.xx.com?id=x" --dbs 检测有哪些数据库 --current-d ...
- 温故知新----线程之Runnable与Callable接口的本质区别
温故知新----线程之Runnable与Callable接口的本质区别 预备知识:Java中的线程对象是Thread,新建线程也只有通过创建Thread对象的实例来创建. 先说结论 1 Runnabl ...
- c++与linux详细计划,精确到每一天(仅80天)
好的,以下是三个月中每一天的学习计划: 第一个月: 第1天:阅读C++教程,熟悉环境,了解基本语法和数据类型 第2天:编写Hello World程序,加深对C++环境的了解 第3天:学习函数的定义和调 ...