权限控制是如何实现的?

一般来说,先有认证才有权限,也就是用户登录后才能判断其权限,未登录用户给他一个默认权限。

Django接收到一个请求,首先经过权限的检查,如果通过检查,拥有访问的权限,则予以放行,进入到视图处理。如果没有通过检查,不会进入视图层,直接返回前端相应信息。

使用权限控制

权限控制类:

class MyPermission(BasePermission):
message = "您没有权限" def has_permission(self, request, view):
# 判断用户是否有权限,逻辑自己定义。返回值为True或False,代表拥有权限或没有权限
user_obj = request.user
if user_obj.type == 3:
return False
else:
return True

views.py:

from rest_framework.views import APIView
from utils.permission import MyPermission class TestView(APIView):
permission_classes = [MyPermission, ] # 使用该权限控制,可以同时使用多个权限控制类 def get(self, request, *args, **kwargs):
pass def post(self, request, *args, **kwargs):
pass '''
等等一系列的视图功能方法
'''

全局权限控制:

settings.py

REST_FRAMEWORK = {
"DEFAULT_PERMISSION_CLASSES" :['utils.permission.Mypermission',]
}

注意:如果有部分类不需要权限判断的话,可以在Mypermission类中添加“permission_classes = []”,即可

源码分析

其实权限的源码流程跟认证的流程基本相同。还是要抓住通过源码要想知道什么,不然就会陷入浩如烟海的源码之中。

1.为什么会使用permission_classes属性变量?

python 的面向对象编程中,我们首先要执行的方法肯定是dispatch方法,所以我们的分析入口就是dispatch方法,在dispatch方法中,可以看到,通过initialize_request方法将django原生的request进行了一次封装。由initialize_request方法的实现过程可以看出,将其封装实例化成了一个Request对象。但权限判断并没有像认证一样初始化到了Request对象中,但对django原生的request封装还是需要强调的,因为编写代码的过程中对django原生的request的使用是必不可免的。

同样的,权限判断的具体过程跟认证一样,也是在dispatch方法中所调用的initial方法中实现。再跳转到initial方法中去。

在initial方法中,可以看到权限判断的方法,没错,就是通过check_permissions方法实现的。再跳转到这个方法中去。

在check_permissions方法中,就可以看到权限的判断就是通过这个for循环实现的。正因为在业务代码中可能存在若干种类型的权限判断,所以才会通过循环去执行我们定义好的权限判断类来完成多个权限体系的判断功能。这样,我们可以感觉到这里的“self.get_permissions()”的返回值应该就是我们在视图类中赋值过的permissions_classes属性变量的值。那就跳转到这个方法中去看看吧。

在get_permissions方法中看到,跟认证一样,返回值同样是一个列表生成式,而这个列表生成式使用的属性变量正是我们赋值过的permission_classes,跟我们之前的猜测完全一致。综上所述,我们为了让drf接口源码使用上我们自己定义的权限判断类,那我们就必须按照源码中写的借口,将permission_classes属性变量赋值

2.在权限判断类中为什么会定义一个名称为has_permission的方法?

回到check_permissions方法中,我们看if判断句,前面刚刚说过,在for中的permission其实就是我们自己定义的权限判断类,那么在if句中的“.has_permission(request,self)”不就应该就是Mypermission类中的方法吗?所以,我们自己定义的Mypermission类中一定要实现has_permission这个方法。(要注意这个方法的参数)

3.has_permission方法中,为什么返回值为布尔值?

还是跟上一个问题一样的,在上图中的if句中,我们可以看到“permission.has_permission(request, self)”的返回值不就是布尔值吗,这个返回值不就是has_permission方法返回值吗?当返回值为False时,就会执行if句中的代码,来抛出异常。

Django REST Framework之权限组件的更多相关文章

  1. Django Rest framework 之 权限

    django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...

  2. Django的rest_framework的权限组件和频率组件源码分析

    前言: Django的rest_framework一共有三大组件,分别为认证组件:perform_authentication,权限组件:check_permissions,频率组件:check_th ...

  3. Django REST Framework 认证 - 权限 - 限制

    一. 认证 (你是谁?) REST framework 提供了一些开箱即用的身份验证方案,并且还允许你实现自定义方案. 自定义Token认证 第一步 : 建表>>>> 定义一个 ...

  4. DRF Django REST framework 之 认证组件(五)

    引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任 ...

  5. restful framework之权限组件

    一.权限简介 只用超级用户才能访问指定的数据,普通用户不能访问,所以就要有权限组件对其限制 二.局部使用 from rest_framework.permissions import BasePerm ...

  6. Django REST framework认证权限和限制和频率

    认证.权限和限制 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制.然后 权限 和 限制 组件决定是否拒绝这个请求. 简单来说就是: 认证确定了你是谁 权限确定你能不 ...

  7. Django Rest Framework之权限

    基本代码结构 url.py: from django.conf.urls import url, include from app import views urlpatterns = [ url(r ...

  8. DRF Django REST framework 之 视图组件(四)

    引言 在我们有几十上百的视图类,都有get,post等方法,在功能类似时,会导致大量的重复代码出现,显然还有很多可以优化的地方.这也就有了视图组件,它的功能非常强大,能很好的优化接口逻辑. 视图组件 ...

  9. django rest framework 解析器组件 接口设计,视图组件 (1)

    一.解析器组件 -解析器组件是用来解析用户请求数据的(application/json), content-type 将客户端发来的json数据进行解析 -必须适应APIView -request.d ...

随机推荐

  1. 使用Docker快速部署ELK分析Nginx日志实践(二)

    Kibana汉化使用中文界面实践 一.背景 笔者在上一篇文章使用Docker快速部署ELK分析Nginx日志实践当中有提到如何快速搭建ELK分析Nginx日志,但是这只是第一步,后面还有很多仪表盘需要 ...

  2. 问题.springmvc错误.415:Unsupported Media Type

    场景是在希望用ajax发post请求,传递一个json对象,在controller中直接使用java对象接收时遇到的,具体错误信息如下: { "timestamp": 150027 ...

  3. 动态数组& allocator

    问题来源 在编写程序的时候,对数组."二维数组"的分配的删除掌握的不是很清楚,不能正确的进行定义初始化. 以及在使用vector的时候,如何正确的定义及初始化 注意!!! 尽量使用 ...

  4. 你真的了解MyBatis中${}和#{}的区别吗?

    动态sql是mybatis的主要特性之一.在mapper中定义的参数传到xml中之后,在查询之前mybatis会对其进行动态解析. mybatis提供了两种支持动态sql的语法:#{} 和 ${}. ...

  5. hdu6437 Problem L.Videos(网络流)

    Problem L.Videos Problem Description: C-bacteria takes charge of two kinds of videos: ’The Collectio ...

  6. codeforces 264 B. Good Sequences(dp+数学的一点思想)

    题目链接:http://codeforces.com/problemset/problem/264/B 题意:给出一个严格递增的一串数字,求最长的相邻两个数的gcd不为1的序列长度 其实这题可以考虑一 ...

  7. hdu5491 The Next 模拟

    Let LL denote the number of 1s in integer DD’s binary representation. Given two integers S1S1 and S2 ...

  8. codeforces 486 D. Valid Sets(树形dp)

    题目链接:http://codeforces.com/contest/486/problem/D 题意:给出n个点,还有n-1条边的信息,问这些点共能构成几棵满足要求的树,构成树的条件是. 1)首先这 ...

  9. c++11特性学习总结

    ubuntu 16.04 自带gcc 5.4 支持c++11 ubuntu 18.04 自带gcc 7.3 支持c++14 查看编译器支持: c++11 c++14 c++17 c++11 featu ...

  10. Java 中创建对象的 5 种方式!

    Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码 Employee类: class Employee implements Cloneable, Serializable { pri ...