Django-restframework 源码之认证组件源码分析

一 前言

之前在 Django-restframework 的流程分析博客中,把最重要的关于认证、权限和频率的方法找到了。该方法是 APIView 的一个名为initial的类方法,也就是在 views 中定义的视图类方法,继承自APIView方法。该方法源码如下:

那么当代码执行到这里时,最开始执行的是用户的认证,也就是perform_autnentication方法。下面来深入的分析一下在用户认证中具体是怎么执行的。

二 用户认证执行流程

进入查看该方法源码如下:

1. 执行APIView.perform_authentication

2. 执行 Request.user

3. 执行Request._authenticate

4. Request.authenticators

5. APIView.initialize_request

6. APIView.get_authticators

7. api_settings.DEFAULT_AUTHENTICATION_CLASSES

到这里就是查找APIView 配置的问题了,后面的DEFAULT_AUTHENTICATION_CLASSES是默认的认证类,该类定义在settings.py文件中。之后我会写一篇 Django 加载项目配置的博客,到时候详细分析一下,这会涉及到 python 的两种加载文件的方式,一种是 import;一种是使用importlib模块导入。

三 自定义认证组件

了解了 restframework 的认证流程,对于需要自定义认证组件其实很明了,就是自定义认证类,重写 authenticate 方法。不过这还不行,我们还需要进行一下配置。

需求:在之前的项目中,我们需要在服务器中保存相关的 cookie 或 session 来进行用户身份校验,那么如何使用 restframework 的认证来实现该需求,使得既能校验身份,也可以不用在服务端保存用户的 cookie 或 session。

首先不管 cookie 或 session 都是为了校验用户的,那么在这里我们可以使用一个随机字符串(加密后的),当客户端朝服务端发送请求时会携带该值,之后进行反解用来对比。

1. urls.py

url(r'^login/', views.Login.as_view()),

2. Views.py

# 获取 随机token值
def get_token(id, salt='123'):
md = hashlib.md5()
md.update(bytes(str(id), encoding='utf-8'))
md.update(bytes(salt, encoding='utf-8')) return md.hexdigest() + '|' + str(id) # 登陆视图类
class Login(APIView): # def dispatch(self, request, *args, **kwargs):
# return super(Login, self).dispatch(request, *args, **kwargs) def post(self, request):
response = {'status': 100, 'msg': None}
name = request.data.get('name')
password = request.data.get('password')
print(name, password)
user_obj = models.UserInfo.objects.filter(name=name, password=password).first()
if user_obj:
token = get_token(user_obj.pk)
response['msg'] = '登陆成功'
response['status'] = 100
response['token'] = token
print('111', token)
else:
response['msg'] = '用户名或密码错误'
return Response(response)

3. authenticate_classes.py

# 校验 token
def check_token(token, salt='123'):
ls = token.split('|')
md = hashlib.md5()
md.update(bytes(ls[-1], encoding='utf-8'))
md.update(bytes(salt, encoding='utf-8'))
if md.hexdigest() == ls[0]:
return True
else:
return False # 改写的认证类
class BookAuth(BaseAuthentication): def authenticate(self, request):
token = request.data.get('token')
print('222', token)
if token:
succ = check_token(token)
if succ:
print('333')
# user =
return
else:
raise NotAuthenticated('认证失败')
else:
raise NotAuthenticated('请先登录')

四 配置自定义认证类

1. 局部配置

假设一个功能需要登陆成功才可以使用,那么只需要在该视图类中定义一个参数authentication_classes

class Book(APIView):
# 配置该参数可以局部使用
authentication_classes = [authticate_classes.BookAuth, ] def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs) def get(self, request, id):
print(request.user, '444')
response = {'status': 100, 'msg': None}
book_obj = models.Book.objects.filter(pk=id).first()
if book_obj:
book_ser = myser.BookSer(book_obj, many=False)
response['book'] = book_ser.data
else:
response['msg'] = '图书没有对象'
response['status'] = 101
return Response(response)

2. 全局使用

全局使用的话需要在项目 settings 中配置,如下:

REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":["app01.authenticate_classes.BookAuth",]
}

这样对 views 中所有的请求方法都有效。因为所有的视图类都会加载 settings 中的配置。这些都是在dispatch方法中完成的。

3. 局部禁用

局部禁用的话只需要在视图类中定义一个空的authentication_classes

authentication_classes = []

Django-restframework 源码之认证组件源码分析的更多相关文章

  1. Django REST framework —— 认证组件源码分析

    我在前面的博客里已经讲过了,我们一般编写API的时候用的方式 class CoursesView(ViewSetMixin,APIView): pass 这种方式的有点是,灵活性比较大,可以根据自己的 ...

  2. Django框架之DRF 认证组件源码分析、权限组件源码分析、频率组件源码分析

    认证组件 权限组件 频率组件

  3. DRF之认证组件源码解析

    认证组件  认证的几种方法:cookie,session,token几种.但是session会使服务器的压力增大,所以我们经常使用的是token.获取唯一的随机字符串: 登陆携带token值的处理: ...

  4. Django Rest framework 框架之认证使用和源码执行流程

    用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...

  5. Django学习之九: auth 认证组件

    目录 Django auth 认证组件 配置使用auth组件及其中间件 request.user 可以直接在template模版中使用 auth组件常用api 获取认证model类 认证检测装饰器@l ...

  6. django rest-framework 4.REST的认证和权限

    目前,我们的API对谁可以编辑或删除代码段没有任何限制.我们想要一些更先进的行为,以确保:(这段话抄自官网) 代码段始终与创建者相关联. 只有身份验证的用户可以创建片段. 只有片段的创建者可以更新或删 ...

  7. Django REST framework —— 权限组件源码分析

    在上一篇文章中我们已经分析了认证组件源码,我们再来看看权限组件的源码,权限组件相对容易,因为只需要返回True 和False即可 代码 class ShoppingCarView(ViewSetMix ...

  8. Django day26 初识认证组件

    一:什么是认证组件 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件 二:认证组件源码分析

  9. drf框架 - 三大认证组件 | 认证组件 | 权限组件 | 频率组件

    RBAC 基于用户权限访问控制的认证 - Role-Based Access Control Django框架采用的是RBAC认证规则,RBAC认证规则通常会分为 三表规则.五表规则,Django采用 ...

随机推荐

  1. Error【0003】:配置桥接网络报错

    1.1 问题背景 在配置cosole宿主机的桥接网络环境时,在修改完/etc/sysconfig/ifcg-ethx和/etc/sysconfig/ifcg-brx后,执行service networ ...

  2. 后端传Long类型至前端js会出现精度丢失问题

    今天开发遇到个问题,Java后端的Long类型数据,传到前端会出现精度丢失,如:164379764419858435,前端会变成164379764419858430.在浏览器中做测试可知,这就是一个精 ...

  3. i春秋——Misc之百度杯

    今天心里很是不开森,想想往日何必那么努力呢?不如你的比比皆是,可是人家就是因为有关系,你又能怎样呢? 你所有应该有的都被打翻了,别灰心,至少你曾经努力过! 愿我未来的学弟学妹们都能一直开开心心的过好每 ...

  4. linux 挂载共享文件夹

    1.背景 通常会有这样的场景,开发人员在Windows编写代码,然后放在linux环境编译,我们通过mount命令就可以实现将代码直接挂到linux环境上去,使Windows上的共享文件夹就像linu ...

  5. 在javaScript中检测数据类型的几种方式

    类型检测的方法 typeof instanceof Object.protype.toString constructor duck type:鸭子类型 typeof 返回一个字符串,适合函数对象和基 ...

  6. 如何看MySql执行计划explain(或desc)

    简介 MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化.EXPLAIN 命令用法十分简单, 在 S ...

  7. itest 开源测试管理项目中封装的下拉列表小组件:实现下拉列表使用者前后端0行代码

    导读: 主要从4个方面来阐述,1:背景:2:思路:3:代码实现:4:使用 一:封装背景       像easy ui 之类的纯前端组件,也有下拉列表组件,但是使用的时候,每个下拉列表,要配一个URL ...

  8. 已实现乐观锁功能,FreeSql.DbContext 准备起航

    上回说到 FreeSql.DbContext 的规则,以及演示它的执行过程,可惜当时还不支持"乐观锁",对于更新数据来讲并不安全. FreeSql 核心库 v0.3.27 已提供乐 ...

  9. .NET(WinCE、WM)转Android开发——Xamarin和Smobiler对比

    对比 WinCE Android 行业场景 扫描分拣.车载.工控 扫描分拣.车载定位 开发语言 C++.C# Java/.NET(Smobiler) 开发环境 Visual Studio Androi ...

  10. FontAwesome 图标字体库的使用

    在前端开发中,许多新手常会遇见一个问题,参考的网页上有类似下图的图标,但在资源里却找不到对应的文件,这是因为这些网页使用了图标库.这里介绍一种常见的图标库——FontAwesome的使用. 1.登录F ...