zoukankan      html  css  js  c++  java
  • 06 drf源码剖析之权限

    06 drf源码剖析之权限

    1. 权限简述

    • 权限与身份验证和限制一起,决定了是否应授予请求访问权限。
    • 权限检查始终在视图的最开始处运行,然后再允许执行其他任何代码。权限检查通常会使用request.userrequest.auth属性中的身份验证信息来确定是否应允许传入请求。
    • 权限用于授予或拒绝不同类别的用户对API不同部分的访问。

    2. 权限使用

    • 自定义权限认证类

      from rest_framework.permissions import BasePermission
      from rest_framework import exceptions
      
      class MyPermission(BasePermission):
          message = {'code': 10001, 'error': '你没权限'}
          def has_permission(self, request, view):
              """
              Return `True` if permission is granted, `False` otherwise.
              """
              if request.user:
                  return True
      
              # raise exceptions.PermissionDenied({'code': 10001, 'error': '你没权限'})
              return False
      
          def has_object_permission(self, request, view, obj):
              """
              Return `True` if permission is granted, `False` otherwise.
              """
              return False
      
    • 在需要权限认证的类中加permission_classes

      class OrderView(APIView):
          permission_classes = [MyPermission,]
          def get(self,request,*args,**kwargs):
              return Response('order')
      
      
      class UserView(APIView):
          permission_classes = [MyPermission, ]
          def get(self,request,*args,**kwargs):
              return Response('user')
      

    3.源码剖析

    • 请求过来先执行dispatch方法

      class APIView(View):
          permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
          
          def dispatch(self, request, *args, **kwargs):
              # 封装request对象...
              self.initial(request, *args, **kwargs)
              # 通过反射执行视图中的方法...
      
    • initial方法过渡

      	def initial(self, request, *args, **kwargs):
              # 版本的处理...
              # 认证...		
              # 权限判断
              self.check_permissions(request)
              
              self.check_throttles(request) # 节流...
      
    • check_permissions方法,依次对权限类对象认证权限

      def check_permissions(self, request):
          # [对象,对象,]
          for permission in self.get_permissions():
              if not permission.has_permission(request, self):
                  self.permission_denied(request, message=getattr(permission, 'message', None))
      
    • get_permissions方法,将权限类实例化成对象列表

      def get_permissions(self):
          return [permission() for permission in self.permission_classes]
      
    • 执行自定义权限类的has_permission方法,判断有无权限

      class MyPermission(BasePermission):
          def has_permission(self, request, view):
              if request.user:
                  return True
              return False
      

    4. 总结

    1. 当用户请求过来时,先执行dispatch方法,通过initial方法执行check_permissions方法
    2. 找到权限的所有类并实例化成对象列表
    3. 循环该实例化对象列表,执行每个对象的has_permission方法
    4. 返回True和False进行权限的认证,可定制错误信息
  • 相关阅读:
    Typora入门使用
    什么是Structed Streaming?
    Spark的join什么情况下可以避免shuffle?
    spark Executor启动过程分析
    在IDEA中使用Git
    Git和SVN的区别
    Flink on Yarn的两种模式
    如何查看执行计划
    SQL Server 堆表与栈表的对比(大表)
    SQL Server中CURD语句的锁流程分析
  • 原文地址:https://www.cnblogs.com/liubing8/p/11941211.html
Copyright © 2011-2022 走看看