DRF 权限

DRF 权限

确定你能不能访问某个接口

DRF提供的权限方案

  1. class AllowAny(BasePermission):
    
  2. class IsAuthenticated(BasePermission):
    
  3. class IsAdminUser(BasePermission):
    
  4. class IsAuthenticatedOrReadOnly(BasePermission):
    
  5. class DjangoModelPermissions(BasePermission):
    
  6. class DjangoModelPermissionsOrAnonReadOnly(DjangoModelPermissions):
    
  7. class DjangoObjectPermissions(DjangoModelPermissions):
    

自定义权限

只有VIP用户才能访问

自定义一个权限类

class MyPermission(BasePermission):
    message = '你不是VIP用户'

    def has_permission(self, request, view):
        # 在认证的时候获取到了用户,现在可以直接用
        if request.user and request.user.type == 2:
            return True
        else:
            return False

视图级别配置

class AuthorListView(ListCreateAPIView):
   queryset = models.Author.objects.all()
   serializer_class = AuthorModelSerializer
   authentication_classes = [MyAuth, ]
   permission_classes = [MyPermission, ]


全局级别配置

# 在settings.py中设置rest framework相关配置项
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ["auth_app.utils.MyAuth", ],
    "DEFAULT_PERMISSION_CLASSES": ["auth_app.utils.MyPermission", ]
}

源码分析

  1. 请求 ——》urls.py ——》as_view ——》APIView的dispatch方法——》执行 self.initial(request, *args, **kwargs)——》执行self.check_permissions(request)

1561895605783

  1. 获取权限类

1561895673365

  1. 获取权限类

1561895698629

  1. 循环执行权限类的 has_permission ,判断是否有权限

1561895739202

posted @ 2019-08-16 16:50  写bug的日子  阅读(127)  评论(0编辑  收藏  举报