Django Rest Framework实现身份认证源码详解

目录
  • 一.Django框架
  • 二.身份认证的两种实现方式:
  • 三.身份认证源码解析流程

一.Django框架

Django确实是一个很强大,用起来很爽的一个框架,在Rest Framework中已经将身份认证全都封装好了,用的时候直接导入authentication.py这个模块就好了。这个模块中5个认证类。但是我们在开发中很少用自带的认证类,而是根据项目实际需要去自己实现认证类。下面是内置的认证类

BaseAuthentication(object):所有的认证相关的类都继承自这个类,我们写的认证类也要继承自这个认证类,类中面有两个方法,authenticate(self,request):这个方法是我们开发中用的最多的,还有一个方法:authentication_header(self,request):这个方法主要是给浏览器返回响应头的。

BasicAuthentication(BaseAuthentication):这个是基于浏览器实现的认证类。

SessionAuthentication(BaseAuthentication):使用Django的会话框架进行身份验证。

TokenAuthentication(BaseAuthentication):简单的基于令牌的身份验证。客户端应通过在“授权”中传递令牌密钥进行身份验证HTTP头,前面加上字符串“Token”

RemoteUserAuthentication(BaseAuthentication):远程用户身份验证。

二.身份认证的两种实现方式:

1.第一种方式就是在views.py模块中去创建一个认证类,这个认证类必须重写authenticate()这个方法,这个方法必须返回一个元组,里面返回用户和token值,然后在需要认证的类视图中注册上这个认证类:

authentication_classes = [AuthClass,],authentication_classes

名字也不能改,后面讲源码的时候会告诉大家为什么这么写。这是第一种认证方式。

2.①:第二中方式是在settings中配置认证模块,这种方式是全局身份认证。首先创建一个utils工具包,然后创建一个auth.py身份认证模块。把认证类写在这里面。这是开发中经常使用的方式,这样views.py中全是类视图,把认证类放到认证模块中,符合高内聚,低耦合的编程思想,也方便后期管理维护。

②:然后将这个认证模块注册到settings.py中,这是全局认证,所有的类视图都会进行身份认证。

③:用户登录的借口是不需要身份认证的,所以在用户登录接口中加上authentication_classes = [],这样登录接口就不会进行身份认证了。

三.身份认证源码解析流程

1.首先当一个请求过来的时候,先走路由的as_view()方法,as_view()方法中调用了dispatch方法,rest framework 中的APIView(view)继承自django中的view,然后重写了dispatch()方法,于是走APIView中的dispatch()方法。

2.重写的dispatch()对django的request进行了重新的封装,调用了initizlize_request()方法对request进行封装,我们进入initizlize_request()这个方法再看一下做了什么操作。

3.initializer_request()这个方法中调用了get_authenticators()得到认证对象的这个方法,我们再进入这个方法看一下做了什么。

4.进入get_authenticators()中发现,这个方法中有一个列表生成器,用来实例化当前认证类,这就是为什么之前要在类视图中注册认证类必须要用这个名字的原因,因为源码中规定了认证类读取的名字。

所以,如果我们自己写了认证类,他会在类视图中找到我们的认证类并执行返回,如果我们没有写认证类呢?会怎么执行?我们继续往下看,看看列表生成器中调中的authentication_classes这个属性它是从哪获得的。

5.我们发现authentication_classes默认是从settings中配置获得的。所以这也是为啥可以把认证类配置在settings中的原因。

然后这就是initizlize_request()方法对request的认证封装的执行流程,封装完后在dispatch()中继续往下执行,当前只是实例化认证类,并没有执行认证。然后我们接着看dispatch()下面认证的执行流程

6.dispatch()调用initial(request, *args, **kwargs)这个方法进行认证,我们看下initial(request, *args, **kwargs)这个方法做了什么。

7.initial(request, *args, **kwargs)这个方法中又调用了三个方法:

perform_authentication(request):身份认证方法

check_permissions(request):权限验证方法

check_throttles(request):节流方法

我们看下perform_authentication(request):身份认证方法都干了些什么。

8.perform_authentication(request):身份认证方法只调用了一个user方法,我们继续看user这个方法。

9.user这个方法调用了_authenticate()这个方法,继续往下看。

10.这次只终于到底了,_authenticate()方法中遍历认证类的所有对象,执行认证类的authenticate方法,这个就是我们写的身份认证方法,这个方法要返回一个元组,我们看下authenticate方法。

11.authenticate()方法返回一个元组,元组中包含当前对象和token值,所以我们重写authenticate()方法也要返回这个元组。这样整个认证执行流程就全结束了。

如果authenitcate()方法抛出异常,就被捕获并执行 self._not_authenticated(),认证不通过并直接返回,就不会走dispatch()下面反射机制找视图函数方法了,反射机制上篇博客我详细的说过了,这里就不说了,如果没有抛出异常,继续走dispatch()下面的代码。

以上就是Django Rest Framework实现身份认证源码详解的详细内容,更多关于Django Rest Framework身份认证的资料请关注我们其它相关文章!

(0)

相关推荐

  • DjangoRestFramework 使用 simpleJWT 登陆认证完整记录

    本文为 djangorestframework-simplejwt 使用记录.(官方文档) 1. 安装 pip install djangorestframework-simplejwt 2. 使用 创建 Django 项目及 app: # 创建名为 simple 的工程 django-admin startproject simple # 创建名为 users 的应用 cd simple python manage.py startapp users 目录结构如下: 在 `simple/set

  • django rest framework 实现用户登录认证详解

    1.安装 pip install djangorestframework 2.创建项目及应用 创建项目 创建应用 目录结构如图 3.设置settings.py 设置数据库连接 # MySQL 增加mysql 连接 DATABASES = { 'default':{ 'ENGINE':'django.db.backends.mysql', 'HOST':'127.0.0.1', 'PORT':'3306', 'NAME':'dbname', # 数据库名 'USER':'username', 'P

  • Django restframework 源码分析之认证详解

    前言 最近学习了 django 的一个 restframework 框架,对于里面的执行流程产生了兴趣,经过昨天一晚上初步搞清楚了执行流程(部分方法还不太清楚),于是想详细的总结一下当来一个请求时,在该框架里面是如何执行的? 启动项目时 昨天在调试django时,发现在 APIView 中打的断点没有断下来,而是打在 View 中的断点断下来了,调试了很多次,最后发现,在 django 项目启动时,会首先加载 urls 中的文件,执行 views 中类的 as_view方法,其实是继承自 API

  • 自定义Django_rest_framework_jwt登陆错误返回的解决

    在使用Django做前端后端项目时,登陆认证方法往往使用的是jwt_token,但是想自定义登陆成功和失败的返回体. 1.当用户名和密码正确就会生成token,返回response是调用的是JWT_RESPONSE_PAYLOAD_HANDLER,如果想自定义返回体就需要重写jwt_response_payload_handler函数. 在项目目录下settings.py中,添加JWT_RESPONSE_PAYLOAD_HANDLER. JWT_AUTH = { 'JWT_EXPIRATION_

  • django restframework serializer 增加自定义字段操作

    在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现这个目的. 假设现在有一个Animal模型,其中有name, type, country字段,country为外键.我们在序列化Animal时,需要额外增加外键country的area信息. 方法一修改数据库,利用model 这里就不多解释,主要来说第二种,不修改django的model,直接使用S

  • Django Rest Framework实现身份认证源码详解

    目录 一.Django框架 二.身份认证的两种实现方式: 三.身份认证源码解析流程 一.Django框架 Django确实是一个很强大,用起来很爽的一个框架,在Rest Framework中已经将身份认证全都封装好了,用的时候直接导入authentication.py这个模块就好了.这个模块中5个认证类.但是我们在开发中很少用自带的认证类,而是根据项目实际需要去自己实现认证类.下面是内置的认证类 BaseAuthentication(object):所有的认证相关的类都继承自这个类,我们写的认证

  • Django 响应数据response的返回源码详解

    响应数据的返回 在 WSGIHandler.__call__(self, environ, start_response) 方法调用了 WSGIHandler.get_response() 方法, 由此得到响应数据对象 response. 如今所要做的, 便是将其返回给客户端. 在 Django 源码小剖: 初探 WSGI中, 简要的概括了请求到来时 django 自带服务器的执行关系, 摘抄如下: make_server() 中 WSGIServer 类已经作为服务器类, 负责接收请求, 调用

  • Android实现屏幕锁定源码详解

    最近有朋友问屏幕锁定的问题,自己也在学习,网上找了下也没太详细的例子,看的资料书上也没有有关屏幕锁定程序的介绍,下个小决心,自己照着官方文档学习下,现在做好了,废话不多说,先发下截图,看下效果,需要注意的地方会加注释,有问题的朋友可以直接留言,我们共同学习交流,共同提高进步!直接看效果图: 一:未设置密码时进入系统设置的效果图如下: 二:设置密码方式预览: 三:密码解密效果图 四:九宫格解密时的效果图 下面来简单的看下源码吧,此处讲下,这个小DEMO也是临时学习下的,有讲的不明白的地方请朋友直接

  • Spring AOP底层源码详解

    ProxyFactory的工作原理 ProxyFactory是一个代理对象生产工厂,在生成代理对象之前需要对代理工厂进行配置.ProxyFactory在生成代理对象之前需要决定到底是使用JDK动态代理还是CGLIB技术. // config就是ProxyFactory对象 // optimize为true,或proxyTargetClass为true,或用户没有给ProxyFactory对象添加interface if (config.isOptimize() || config.isProxy

  • Java并发编程之ConcurrentLinkedQueue源码详解

    一.ConcurrentLinkedQueue介绍 并编程中,一般需要用到安全的队列,如果要自己实现安全队列,可以使用2种方式: 方式1:加锁,这种实现方式就是我们常说的阻塞队列. 方式2:使用循环CAS算法实现,这种方式实现队列称之为非阻塞队列. 从点到面, 下面我们来看下非阻塞队列经典实现类:ConcurrentLinkedQueue (JDK1.8版) ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全的队列.当我们添加一个元素的时候,它会添加到队列的尾部,当我们

  • Java8中AbstractExecutorService与FutureTask源码详解

    目录 前言 一.AbstractExecutorService 1.定义 2.submit 3.invokeAll 4.invokeAny 二.FutureTask 1.定义 2.构造方法 3.get 4.run/ runAndReset 5. cancel 三.ExecutorCompletionService 1.定义 2.submit 3.take/ poll 总结 前言 本篇博客重点讲解ThreadPoolExecutor的三个基础设施类AbstractExecutorService.F

  • python目标检测SSD算法预测部分源码详解

    目录 学习前言 什么是SSD算法 ssd_vgg_300主体的源码 学习前言 ……学习了很多有关目标检测的概念呀,咕噜咕噜,可是要怎么才能进行预测呢,我看了好久的SSD源码,将其中的预测部分提取了出来,训练部分我还没看懂 什么是SSD算法 SSD是一种非常优秀的one-stage方法,one-stage算法就是目标检测和分类是同时完成的,其主要思路是均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归,整个过程只需要一步,所以其优势是速度

  • python目标检测SSD算法训练部分源码详解

    目录 学习前言 讲解构架 模型训练的流程 1.设置参数 2.读取数据集 3.建立ssd网络. 4.预处理数据集 5.框的编码 6.计算loss值 7.训练模型并保存 开始训练 学习前言 ……又看了很久的SSD算法,今天讲解一下训练部分的代码.预测部分的代码可以参照https://blog.csdn.net/weixin_44791964/article/details/102496765 讲解构架 本次教程的讲解主要是对训练部分的代码进行讲解,该部分讲解主要是对训练函数的执行过程与执行思路进行详

  • Android线程间通信Handler源码详解

    目录 前言 01. 用法 02.源码 03.结语 前言 在[Android]线程间通信 - Handler之使用篇主要讲了 Handler 的创建,发送消息,处理消息 三个步骤.那么接下来,我们也按照这三个步骤,从源码中去探析一下它们具体是如何实现的.本篇是关于创建源码的分析. 01. 用法 先回顾一下,在主线程和非主线程是如何创建 Handler 的. //主线程 private val mHandler: Handler = object : Handler(Looper.getMainLo

  • Android开发数据结构算法ArrayList源码详解

    目录 简介 ArrayList源码讲解 初始化 扩容 增加元素 一个元素 一堆元素 删除元素 一个元素 一堆元素 修改元素 查询元素 总结 ArrayList优点 ArrayList的缺点 简介 ArrayList是List接口的一个实现类,它是一个集合容器,我们通常会通过指定泛型来存储同一类数据,ArrayList默认容器大小为10,自身可以自动扩容,当容量不足时,扩大为原来的1.5倍,和上篇文章的Vector的最大区别应该就是线程安全了,ArrayList不能保证线程安全,但我们也可以通过其

随机推荐