• Django DRF权限组件


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

    一、简单示例

    1、per.py 自定义权限类

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

    2、views.py

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

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

    1. REST_FRAMEWORK = {
    2. "UNAUTHENTICATED_USER": None,
    3. "UNAUTHENTICATED_TOKEN": None,
    4. 自定义权限组件的全局配置
    5. "DEFAULT_PERMISSION_CLASSES":[
    6. 'ext.per.MyPerssion',
    7. ]
    8. }

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

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

    1. '''自定义权限类'''
    2. from rest_framework.permissions import BasePermission
    3. class MyPermission1(BasePermission):
    4. # 自定义一个类变量,处理错误信息的处理
    5. # 权限校验失败,会这里来返回错误信息;
    6. message = {"status":False,"msg":"无权访问1"}
    7. def has_permission(self, request, view):
    8. print("MyPermission1")
    9. return False
    10. class MyPermission2(BasePermission):
    11. message = {"status": False, "msg": "无权访问2"}
    12. def has_permission(self, request, view):
    13. print("MyPermission2")
    14. return False
    15. class MyPermission3(BasePermission):
    16. message = {"status": False, "msg": "无权访问3"}
    17. def has_permission(self, request, view):
    18. print("MyPermission3")
    19. return False

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

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

    3、views.py

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

    三、案例应用

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

    1、models.py

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

    2、urls.py

    1. urlpatterns = [
    2. path('login/', views.LoginView.as_view()),
    3. path('user/', views.UserView.as_view()),
    4. path('order/', views.OrderView.as_view()),
    5. path('avatar/', views.AvatarView.as_view()),
    6. ]

    3、per.py

    1. # 员工权限认证
    2. class UserPermission(BasePermission):
    3. message = {"status":False,"msg":"无权访问"}
    4. def has_permission(self, request, view):
    5. if request.user.role == 3:
    6. return True
    7. else:
    8. return False
    9. # 经理权限认证
    10. class ManagerPermission(BasePermission):
    11. message = {"status": False, "msg": "无权访问"}
    12. def has_permission(self, request, view):
    13. if request.user.role == 2:
    14. return True
    15. else:
    16. return False
    17. # 老板权限认证
    18. class BossPermission(BasePermission):
    19. message = {"status": False, "msg": "无权访问"}
    20. def has_permission(self, request, view):
    21. if request.user.role == 1:
    22. return True
    23. else:
    24. return False

    4、view.py

    1. from rest_framework.views import APIView
    2. # 满足任意条件即可,A条件、B条件、C条件
    3. class NbApiView(APIView):
    4. def check_permissions(self, request):
    5. # 定义一个错误列表,最后去列表中的第一个错误信息
    6. no_permission_object = []
    7. for permission in self.get_permissions():
    8. if permission.has_permission(request,self):
    9. return
    10. else:
    11. no_permission_object.append(permission)
    12. else:
    13. self.permission_denied(request,
    14. message=getattr(no_permission_object[0],'message',None),
    15. code=getattr(no_permission_object[0],'code',None))

    5、views.py

    1. class UserView(NbApiView):
    2. # 经理、老板、员工都可以访问
    3. permission_classes = [UserPermission,ManagerPermission,BossPermission]
    4. def get(self,request):
    5. return Response({"status":True,"data":[11,22,33,44]})
    6. class OrderView(NbApiView):
    7. # 经理或者老板可以访问
    8. permission_classes = [ManagerPermission,BossPermission]
    9. def get(self,request):
    10. return Response({"status":True,"data":[11,22,33,44]})
    11. class AvatarView(NbApiView):
    12. # 老板或者员工可以访问
    13. permission_classes = [UserPermission,BossPermission]
    14. def get(self,request):
    15. return Response({"status":True,"data":[11,22,33,44]})

  • 相关阅读:
    JS —— js中的节流与防抖
    node多版本管理器nvm
    字符串流与文件操作——(学习笔记)
    c++代码:文件的读写实现_txt文本数据流
    创建MySQL只读权限用户
    tomcat启动jvm内存设置
    html[Attributes Style]什么意思
    2022最新上传ipa到appstore的步骤说明
    地图结构 | 图解占据栅格地图原理(附Matlab建图实验)
    搜索效率提升200%的高级指令及其使用技巧(百度篇)
  • 原文地址:https://blog.csdn.net/weixin_47401101/article/details/134508445