Django DRF权限组件

在Django的drf框架内的权限组件,如果遇到多个权限认证类,是需要所有的权限类都要通过验证,才能访问视图。

一、简单示例

1、per.py 自定义权限类

from rest_framework.permissions import BasePermission
import randomclass MyPerssion(BasePermission):# 自定义一个类变量,处理错误信息的处理# 权限校验失败,会来这里找返回信息;message = {"status":False,"msg":"无权访问"}# 模拟验证def has_permission(self, request, view):#获取请求中的数据,然后进行校验v1 = random.randint(1,3)if v1 == 2:return Trueelse:return

2、views.py

class UserView(APIView):permission_classes = [MyPerssion,]def get(self,request):print(request.user,request.auth)return Response("UserView")

3、settings.py ,如果需要全局设置,可以如下设置

REST_FRAMEWORK = {"UNAUTHENTICATED_USER": None,"UNAUTHENTICATED_TOKEN": None,自定义权限组件的全局配置"DEFAULT_PERMISSION_CLASSES":['ext.per.MyPerssion',]
}

 二、如果存在多个认证类的情况下,实现部分认证类通过即可通过验证,就需要重写has_perssion方法,示例如下:

1、per.py  ,自定义权限类,下面模拟定义了3个权限类

'''自定义权限类'''
from rest_framework.permissions import BasePermissionclass MyPermission1(BasePermission):# 自定义一个类变量,处理错误信息的处理# 权限校验失败,会这里来返回错误信息;message = {"status":False,"msg":"无权访问1"}def has_permission(self, request, view):print("MyPermission1")return Falseclass MyPermission2(BasePermission):message = {"status": False, "msg": "无权访问2"}def has_permission(self, request, view):print("MyPermission2")return Falseclass MyPermission3(BasePermission):message = {"status": False, "msg": "无权访问3"}def has_permission(self, request, view):print("MyPermission3")return False

2、 view.py  自定义NbApiView,继承APIView,重写check_permission方法,实现多个权限类认证的关系,改为或的关系。

'''使得权限类认证之间关系是或的关系,自定义'''from rest_framework.views import APIView# 满足任意条件即可,A条件、B条件、C条件
class NbApiView(APIView):def check_permissions(self, request):# 定义一个错误列表,最后去列表中的第一个错误信息no_permission_object = []for permission in self.get_permissions():if permission.has_permission(request,self):returnelse:no_permission_object.append(permission)else:self.permission_denied(request,message=getattr(no_permission_object[0],'message',None),code=getattr(no_permission_object[0],'code',None))

3、views.py

from ext.view import NbApiView
class OrderView(NbApiView):permission_classes = [MyPermission1,MyPermission2,MyPermission3,]def get(self,request):return Response({"status":True,"data":[11,22,33,44]})

三、案例应用

有老板(boss)、经理(manager)、员工(user)三个角色, 有三个视图,分别有不同权限的人可以访问,实现方法如下:

1、models.py

class UserInfo(models.Model):'''用户表'''role = models.IntegerField(verbose_name="角色",choices=((1,"总监"),(2,"经理"),(3,"员工")),default=3)username = models.CharField(verbose_name="用户名",max_length=32)password = models.CharField(verbose_name="密码",max_length=64)# 临时测试方法,token可以存放到很多地方,例如radis jwt等token = models.CharField(verbose_name="TOKEN",max_length=64,null=True,blank=True)

2、urls.py

urlpatterns = [path('login/', views.LoginView.as_view()),path('user/', views.UserView.as_view()),path('order/', views.OrderView.as_view()),path('avatar/', views.AvatarView.as_view()),
]

3、per.py

# 员工权限认证
class UserPermission(BasePermission):message = {"status":False,"msg":"无权访问"}def has_permission(self, request, view):if request.user.role == 3:return Trueelse:return False# 经理权限认证
class ManagerPermission(BasePermission):message = {"status": False, "msg": "无权访问"}def has_permission(self, request, view):if request.user.role == 2:return Trueelse:return False# 老板权限认证
class BossPermission(BasePermission):message = {"status": False, "msg": "无权访问"}def has_permission(self, request, view):if request.user.role == 1:return Trueelse:return False

4、view.py

from rest_framework.views import APIView# 满足任意条件即可,A条件、B条件、C条件
class NbApiView(APIView):def check_permissions(self, request):# 定义一个错误列表,最后去列表中的第一个错误信息no_permission_object = []for permission in self.get_permissions():if permission.has_permission(request,self):returnelse:no_permission_object.append(permission)else:self.permission_denied(request,message=getattr(no_permission_object[0],'message',None),code=getattr(no_permission_object[0],'code',None))

5、views.py

class UserView(NbApiView):# 经理、老板、员工都可以访问permission_classes = [UserPermission,ManagerPermission,BossPermission]def get(self,request):return Response({"status":True,"data":[11,22,33,44]})class OrderView(NbApiView):# 经理或者老板可以访问permission_classes = [ManagerPermission,BossPermission]def get(self,request):return Response({"status":True,"data":[11,22,33,44]})class AvatarView(NbApiView):# 老板或者员工可以访问permission_classes = [UserPermission,BossPermission]def get(self,request):return Response({"status":True,"data":[11,22,33,44]})

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

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

相关文章

傅里叶级数公式及其收敛问题

文章目录 abstract函数展开成傅里叶系数傅里叶系数求解 a 0 a_0 a0​求解 a n a_n an​求解 b n b_n bn​小结 傅里叶级数🎈周期为 2 π 2\pi 2π的函数的fourier级数展开公式小结三角级数收敛问题Dirichlet收敛定理例 abstract 傅里叶级数公式及其收敛问题介绍周期…

自动化运维中间件架构概况

自动化运维中间件架构概况 kubernetesjenkins 安装k8s后 设置 Jenkins 任务: 在 Jenkins 中创建一个新的任务: 配置源代码管理:选择 Git,并提供 GitLab 仓库的 URL、凭据和分支信息。配置构建步骤:选择 Maven 构建,…

集合的自反关系和对称关系

集合的自反关系和对称关系 一:集合的自反关系1:原理:2:代码实现 二:对称关系1:原理:2:代码实现 三:总结 一:集合的自反关系 1:原理: …

【python】直方图正则化详解和示例

直方图正则化(Histogram Normalization)是一种图像增强技术,目的是改变图像的直方图以改善图像的质量。具体来说,它通过将图像的直方图调整为指定的形状,以增强图像的对比度和亮度。 直方图正则化的基本步骤如下&…

【Android Jetpack】Hilt的理解与浅析

文章目录 依赖注入DaggerHiltKoin添加依赖项Hilt常用注解的含义HiltAndroidAppAndroidEntryPointInjectModuleInstallInProvidesEntryPoint Hilt组件生命周期和作用域如何使用 Hilt 进行依赖注入 本文只是进行了简单入门,博客仅当做笔记用。 依赖注入 依赖注入是一…

某60区块链安全之不安全的随机数实战二学习记录

区块链安全 文章目录 区块链安全不安全的随机数实战二实验目的实验环境实验工具实验原理实验内容EXP利用 不安全的随机数实战二 实验目的 学会使用python3的web3模块 学会以太坊不安全的随机数漏洞分析及利用 实验环境 Ubuntu18.04操作机 实验工具 python3 实验原理 由…

吴恩达《机器学习》9-1:代价函数

一、引入新标记方法 首先,引入一些新的标记方法,以便更好地讨论神经网络的代价函数。考虑神经网络的训练样本,其中每个样本包含输入 x 和输出信号 y。我们用 L 表示神经网络的层数,表示每层的神经元个数(表示输出层神…

CISP练习测试题

免责声明 文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! 某公司准备在业务环境中部署一种新的计算机产品,下列哪一项…

基于单片机GPS轨迹定位和里程统计系统

**单片机设计介绍, 基于单片机GPS轨迹定位和里程统计系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 一个基于单片机、GPS和里程计的轨迹定位和里程统计系统可以被设计成能够在移动的交通工具中精确定位车辆的位置…

Spring Boot - 自定义注解来记录访问路径以及访问信息,并将记录存储到MySQL

1、准备阶段 application.properties&#xff1b;yml 可通过yaml<互转>properties spring.datasource.urljdbc:mysql://localhost:3306/study_annotate spring.datasource.usernameroot spring.datasource.password123321 spring.datasource.driver-class-namecom.mysq…

论x巴克app签名的逆向分析过程《完整篇》

app地址—> 点击直达 密码&#xff1a;2fkq工具 jadx-gui 自己下载待定

短视频账号矩阵系统saas管理私信回复管理系统

一、短视频矩阵号系统源码开发层面如何来解决&#xff1f; 1.短视频矩阵号系统源码搭建中&#xff0c;首先开发者需要保证api接口的稳定性 &#xff0c;保证权限应用场景满足官方平台的开发预期。api---待发布、用户管理与授权绑定、私信回复与评论管理等是非常重要的权限接口。…

【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…

苹果CMS首涂第30套可装修DIY主题模板免授权版

这是一款可以装修的主题&#xff0c;类似淘宝店装修一样&#xff0c;可以针对首页、栏目页、详情页、播放页进行自定义装修&#xff0c;内置10个模块自由选择、添加、修改、删除、排序操作&#xff0c;后续升级还会增加更多实用和个性模块供选择&#xff0c;主题内包含的导航、…

C语言的5个内存段你了解吗?( 代码段/数据段/栈/堆)

前言&#xff1a;这些内存段在程序运行时起着不同的作用&#xff0c;有不同的分配方式和存储内容。对于 C 语言程序员来说&#xff0c;了解这些内存段的特性和用途有助于更好地理解内存管理、变量的存储位置以及程序执行过程中的内存分配情况 1. 代码段 (Code Segment) 内容&a…

Actor对象的引用 怎么设置他的材质?或设置是否启用重力?

这个蓝图我是想当重叠触发,将另一个Target Actor(一个球体)设置他的z增加50,但是为什么在触发的时候会抽搐?而且我想要设置他的材质等等这些属性都不行

什么是希尔伯特空间?

照片由 丹克里斯蒂安佩杜雷什 on Unsplash 一、说明 在本文中&#xff0c;我们将探讨希尔伯特空间这个非常重要的主题。希尔伯特空间由于其特性而经常出现在物理和工程中。为了理解希尔伯特空间&#xff0c;我们从度量空间的定义开始。 二、基础概念 集合是定义明确的元素的集合…

Flutter 使用 device_info_plus 遇到的问题

问题&#xff1a;引用device_info_plus 插件出现了异常&#xff0c;不知道为啥打开项目的时候就不能用了。 解决&#xff1a;改了版本解决 Target of URI doesnt exist: package:device_info_plus/device_info_plus.dart. (Documentation) Try creating the file reference…

广州华锐互动VRAR | VR课件内容编辑器解决院校实践教学难题

VR课件内容编辑器由VR制作公司广州华锐互动开发&#xff0c;是一款专为虚拟现实教育领域设计的应用&#xff0c;它能够将传统的教学内容转化为沉浸式的三维体验。通过这款软件&#xff0c;教师可以轻松创建和编辑各种虚拟场景、模型和动画&#xff0c;以更生动、直观的方式展示…

kafka本地安装报错

Error: VM option ‘UseG1GC’ is experimental and must be enabled via -XX:UnlockExperimentalVMOptions. #打开 bin/kafka-run-class.sh KAFKA_JVM_PERFORMANCE_OPTS“-server -XX:UseG1GC -XX:MaxGCPauseMillis20 -XX:InitiatingHeapOccupancyPercent35 -XX:ExplicitGCInv…