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. BZOJ_1801_[Ahoi2009]chess 中国象棋_DP

    BZOJ_1801_[Ahoi2009]chess 中国象棋_DP Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像 ...

  2. 【游戏开发】小白学Lua——从Lua查找表元素的过程看元表、元方法

    引言 在上篇博客中,我们简单地学习了一下Lua的基本语法.其实在Lua中有一个还有一个叫元表的概念,不得不着重地探讨一下.元表在实际地开发中,也是会被极大程度地所使用到.本篇博客,就让我们从Lua查找 ...

  3. vue不是内部或外部命令解决验证方案

    一.前提 1.该教程是在你已经安装配置好node.js和express情况下 2.你已经完成了vue和vue-cli的全局安装 3.完成以上2步后,使用vue指令,会显示"vue不是内部或外 ...

  4. 我的mfc基础知识点

    最近由于作业的缘故,结交了mfc这个新朋友,虽然他对我还很是陌生,相信日久定能生情!现在记录一些学习的笔记,备忘. MFC提供了不同类型的设备描述表的类(绘图类):CDC.CPaintDC.CClie ...

  5. CISP-PTE注册信息安全专业人员渗透测试工程师知识体系大纲

    CISP-PTE注册信息安全专业人员渗透测试工程师知识体系大纲 都是图.. 不足之处,欢迎补充

  6. 百度推出 MIP Baidu Path链接

    在站长将站点 MIP 化时,需要关注 URL 的一共有三个:MIP URL, MIP-Cache URL 以及 MIP Baidu Path. 从 URL 说起 在互联网中,URL 定义页面的地址,每 ...

  7. C#相等性 - 三个方法和一个接口

    简介 C#(.NET)的object类里面有三个关于判断相等性的方法: public virtual bool Equals(object obj) public static bool Equals ...

  8. OpenResty 在又拍云容器平台中的应用

    大家好,我是又拍云叶靖,今天主要分享 OpenResty 在又拍云容器平台中的应用.目前又拍云有很多产品,其中很多都使用了 OpenResty 技术,比如又拍云的 CDN .网关都是基于 OpenRe ...

  9. 《HelloGitHub》第 33 期

    公告 欢迎 点击分享 自荐或发现的开源项目,也可安装 分享插件 更便捷地推荐有趣的开源项目. 小伙伴们,新的一年就要来了,今年的 Bug 改完了吗?先看看<HelloGitHub>最新一期 ...

  10. “==”、“equals()”、“hashcode()”之间的秘密

    前言 万丈高楼平地起,今天的聊点基础而又经常让人忽视的话题,比如“==”与“equals()”区别?为何当我们重写完"equals()"后也要有必要去重写"hashcod ...