REST framework 权限管理源码分析

REST framework 权限管理源码分析

同认证一样,dispatch()作为入口,从self.initial(request, *args, **kwargs)进入initial()

    def initial(self, request, *args, **kwargs):# .......# 用户认证self.perform_authentication(request)# 权限控制self.check_permissions(request)# ...

check_permissions()便是权限管理源码的入口

    # 权限管理def check_permissions(self, request):"""Check if the request should be permitted.Raises an appropriate exception if the request is not permitted."""for permission in self.get_permissions():if not permission.has_permission(request, self):self.permission_denied(request, message=getattr(permission, 'message', None))

和用户认证一样,同样遍历一个权限类对象列表,并且调用该列表中元素的has_permission()方法,该方法返回布尔值,True代表有权限,False代表没有权限.

    def get_permissions(self):return [permission() for permission in self.permission_classes]

如果没有权限,就调用permission_denied()

    def permission_denied(self, request, message=None):if request.authenticators and not request.successful_authenticator:raise exceptions.NotAuthenticated()raise exceptions.PermissionDenied(detail=message)

如果使用了REST的认证框架(authentication_classes数组不为空)并且身份认证失败,就抛出NotAuthenticated异常,否则会抛出PermissionDenied异常

class NotAuthenticated(APIException):status_code = status.HTTP_401_UNAUTHORIZEDdefault_detail = _('Authentication credentials were not provided.')default_code = 'not_authenticated'

NotAuthenticated会导致一个401错误(缺少用户凭证)

class PermissionDenied(APIException):status_code = status.HTTP_403_FORBIDDENdefault_detail = _('You do not have permission to perform this action.')default_code = 'permission_denied'

而PermissionDenied会返回错误403(拒绝授权访问)

在向permission_denied()类传递参数时,使用了反射

self.permission_denied(request, message=getattr(permission, 'message', None))

会在这个权限类对象中寻找message属性,没找到就使用None,而这个参数在后来只会被用在PermissionDenied异常上,这些异常都继承自APIException,而在APIException的构造器中,可以发现detail参数就是异常描述,而在自己的权限类中定义message属性可以改变认证失败后的描述

class APIException(Exception):status_code = status.HTTP_500_INTERNAL_SERVER_ERRORdefault_detail = _('A server error occurred.')default_code = 'error'def __init__(self, detail=None, code=None):if detail is None:detail = self.default_detailif code is None:code = self.default_code# ...

示例

# api/utils/Permission.py
from rest_framework.permissions import BasePermissionclass CommonPermission(BasePermission):"""普通用户权限,作用于全局"""def has_permission(self, request, view):print(request.user)if request.user.user_type == 1:return Truedef has_object_permission(self, request, view, obj):"""一旦获得View权限,将获得所有object权限:return: True"""return Trueclass VipPermission(BasePermission):"""VIP 用户权限"""message = '您首先要称为VIP才能访问'def has_permission(self, request, view):print(request.user)if request.user.user_type == 2:return Truedef has_object_permission(self, request, view, obj):return True
# api/view.py
from django.shortcuts import HttpResponse
from django.http import JsonResponse
from rest_framework.views import APIView
from api.utils.Permission import VipPermissionclass LoginView(APIView):authentication_classes = []# 登录无需权限认证permission_classes = []def post(self, request, *args, **kwargs):pass@method_decorator(csrf_exempt, name='dispatch')
class ShopView(APIView):def get(self, request, *args, **kwargs):return HttpResponse(request.user.username)def post(self, request, *args, **kwargs):return HttpResponse('POST')class VipIndexView(APIView):"""只授权给VIP用户查看"""permission_classes = [VipPermission]def get(self, *args, **kwargs):return JsonResponse("welcome VIP ", safe=False)
# RESTdemo.setting.py
REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ['api.utils.MyAuthentication.MyAuthentication'],'UNAUTHENTICATED_USER': None,'UNAUTHENTICATED_TOKEN': None,'DEFAULT_PERMISSION_CLASSES': ['api.utils.Permission.CommonPermission']
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决larave-dompdf中文字体显示问题

0、使用MPDF dompdf个人感觉没有那么好用,最终的生产环境使用的是MPDF,github上有文档说明。如果你坚持使用,下面是解决办法。可以明确的说,中文乱码是可以解决的。 1、安装laravel-dompdf依赖。 Packagist:https://pa…

mfc程序转化为qt_小峰的QT学习笔记

我的专业是输电线路,上个学期,我们开了一门架空线路设计基础的课,当时有一个大作业是计算线路的比载,临界档距,弧垂最低点和安装曲线。恰逢一门结课考试结束,大作业ddl快到,我和另外两个同专业的…

MS SQL的存储过程

-- -- Author: -- Create date: 2016-07-01 -- Description: 注册信息 -- ALTER PROCEDURE [dbo].[sp_MebUser_Register]( UserType INT, MobileNumber VARCHAR(11), MobileCode VARCHAR(50), LoginPwd VARCHAR(50), PayPwd VARCHAR(50), PlateNumber VARCHAR(20), UserTr…

mysql 中 all any some 用法

-- 建表语句 CREATE TABLE score(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),SUBJECT VARCHAR(20),score INT);-- 添加数据 INSERT INTO score VALUES (NULL,张三,语文,81), (NULL,张三,数学,75), (NULL,李四,语文,76), (NULL,李四,数学,90), (NULL,王五,语文,81), (…

REST framework 用户认证源码

REST 用户认证源码 在Django中,从URL调度器中过来的HTTPRequest会传递给disatch(),使用REST后也一样 # REST的dispatch def dispatch(self, request, *args, **kwargs):""".dispatch() is pretty much the same as Djangos regular dispatch,but w…

scrapyd部署_如何通过 Scrapyd + ScrapydWeb 简单高效地部署和监控分布式爬虫项目

来自 Scrapy 官方账号的推荐需求分析初级用户:只有一台开发主机能够通过 Scrapyd-client 打包和部署 Scrapy 爬虫项目,以及通过 Scrapyd JSON API 来控制爬虫,感觉 命令行操作太麻烦 ,希望能够通过浏览器直接部署和运行项目专业用…

最长上升子序列 (LIS算法(nlong(n)))

设 A[t]表示序列中的第t个数&#xff0c;F[t]表示从1到t这一段中以t结尾的最长上升子序列的长度&#xff0c;初始时设F [t] 0(t 1, 2, ..., len(A))。则有动态规划方程&#xff1a;F[t] max{1, F[j] 1} (j 1, 2, ..., t - 1, 且A[j] < A[t])。 现在&#xff0c;我们仔细…

牛顿插值--python实现

from tabulate import tabulate import sympy""" 牛顿插值法 """class NewtonInterpolation:def __init__(self, x: list, y: list):self.Xi = xself

css摇曳的_HTML5+CSS3实现树被风吹动摇晃

1新建html文档。2书写hmtl代码。3书写css代码。.trunk, .trunk div { background: #136086; width: 100px; height: 10px; position: absolute; left: 50%; top: 70%; margin-left: -10px; -webkit-animation-name: rot; animation-name: rot; -webkit-animation-duration: 2.0…

素数路(prime)

素数路(prime) 题目描述 已知一个四位的素数&#xff0c;要求每次修改其中的一位&#xff0c;并且要保证修改的结果还是一个素数&#xff0c;还不能出现前导零。你要找到一个修改数最少的方案&#xff0c;得到我们所需要的素数。 例如把1033变到8179&#xff0c;这里是一个最短…

python多线程单核_002_Python多线程相当于单核多线程的论证

很多人都说python多线程是假的多线程!下面进行论证解释:一、我们先明确一个概念&#xff0c;全局解释器锁(GIL)Python代码的执行由Python虚拟机(解释器)来控制。Python在设计之初就考虑要在主循环中&#xff0c;同时只有一个线程在执行&#xff0c;就像单CPU的系统中运行多个进…

detail:JSON parse error - Expecting value: line 1 column 1 (char 0)

detail":"JSON parse error - Expecting value: line 1 column 1 (char 0) 在调用接口时返回400错误&#xff0c;详情是 {detail":"JSON parse error - Expecting value: line 1 column 1 (char 0)"}原因是传送数据的格式有问题&#xff0c;不要使用…

【IDEA 2016】intellij idea tomcat jsp 热部署

刚开始用IDEA&#xff0c;落伍的我&#xff0c;只是觉得IDEA好看。可以换界面。想法如此的low。 真是不太会用啊&#xff0c;弄好了tomcat。程序启动竟然改动一下就要重启&#xff0c;JSP页面也一样。 IDEA可以配置热部署&#xff0c;打开tomcat配置页面&#xff0c;将红框处&a…

C# where用法解析

where 子句用于指定类型约束&#xff0c;这些约束可以作为泛型声明中定义的类型参数的变量。1.接口约束。例如&#xff0c;可以声明一个泛型类 MyGenericClass&#xff0c;这样&#xff0c;类型参数 T 就可以实现 IComparable<T> 接口&#xff1a;public class MyGeneric…

ubuntu进入桌面自动启动脚本_在 Ubuntu 下开机自启动自己的 QT 程序而不启动 Ubuntu 的桌面...

1. /etc/profile 方式实现这个功能&#xff0c;要完成两步&#xff1a;1、系统设置-> 用户账户-> 点击我的账户-> 点击右上角的解锁-> 打开自动登录-> 点击右上角的锁定-> 退出系统设置2、在 /etc/profile 文件的开头添加执行 qt 程序的命令。如&#xff1a;…

Java obj与JSON互转(jackson)

JSON 解析 常见的json解析器&#xff1a; jsonlibGson(谷歌)fastjson(阿里)jackson(Spring内置) jackson 依赖jar包 jackson-annotations/jackson-core/jackson-databind/ 官网下载地址 1. Java对象转JSON 1.1 核心对象 ObjectMapper 1.2常用转换方法 writeValue(参…

如何制作一个简单的APP应用软件?

如今随着移动智能手机的普及&#xff0c;让APP的市场一片繁荣&#xff0c;现在市场上的APP数量数不胜数&#xff0c;对于APP开发的我们很多外行人也许认为&#xff0c;开发APP是不是特别难&#xff0c;是不是只有资历很高的程序员才能够完成这个任务&#xff0c;或者说要想开发…

I/O重定向

每个进程都至少有3个信息&#xff1a;“标准输入”stdin、“标准输出”stdout、和“标准出错”stderr。标准输入通常来自键盘&#xff0c;标准输出和标准错误输出通常被发往屏幕&#xff08;并不会保存在磁盘文件中&#xff09;。有些时候&#xff0c;需要从文件读取输入&#…

java 自动装拆箱

title: “java 自动装拆箱” tags: Java 将基本数据类型封装成对象的过程叫做装箱&#xff08;boxing&#xff09;&#xff0c;反之基本数据类型对应的包装类转换为基本数据类型的过程叫做拆箱&#xff08;unboxing&#xff09;; 基本数据类型与其他对象的区别 基本数据类型 …

设计模式11---组合模式(Composite Pattern)

一、组合模式定义 将对象组合成树形结构以表示“部分-整体”的层次结构&#xff0c;使得用户对单个对象和组合对象的使用具有一致性。Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compos…