DRF权限

权限的源码

 # APIView --->dispatch ---> initial ---> self.perform_authentication(request)(APIView的对象方法)
    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():
            # 权限类一定有一个has_permission权限方法,用来做权限认证的
            # 参数:权限对象self、请求对象request、视图类对象
            # 返回值:有权限返回True,无权限返回False
            if not permission.has_permission(request, self):
                self.permission_denied(
                    request,
                    message=getattr(permission, 'message', None),
                    code=getattr(permission, 'code', None)
                )

 

权限的使用

# 写一个类,继承BasePermission,重写has_permission,如果权限通过,就返回True,不通过就返回False
from rest_framework.permissions import BasePermission


class UserPermission(BasePermission):
    def has_permission(self, request, view):
        # 不是超级用户,不能访问
        # 由于认证已经过了,request内就有user对象了,当前登录用户
        user = request.user  # 当前登录用户
        # 如果该字段用了choice,通过get_字段名_display()就能取出choice后面的中文
        print(user.get_user_type_display())
        if user.user_type == 1:
            return True
        else:
            return False
        
# 局部使用
class TestView(APIView):
    permission_classes = [app_auth.UserPermission]

# 全局使用
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ["app01.app_auth.MyAuthentication", ],
    'DEFAULT_PERMISSION_CLASSES': ["app01.app_auth.UserPermission"],
}

# 局部禁用
class TestView(APIView):
    permission_classes = []

 

内置权限的使用

# 演示一下内置权限的使用IsAdminUser
# 1 创建超级管理员
# 2 写一个测试视图类
# 演示内置权限 超级管理员可以查看
    from rest_framework.permissions import IsAdminUser
    from rest_framework.authentication import SessionAuthentication

    class TestView3(APIView):
        authentication_classes = [SessionAuthentication]
        permission_classes = [IsAdminUser]

        def get(self, request, *args, **kwargs):
            return Response("这是测试数据2222222  超级管理员可以看")
# 3 超级用户登录到admin,再访问test3就有权限
# 4 正常的话,普通管理员没有权限看(判断的是is_staff字段)

 

posted @ 2021-06-11 17:11  Palpitate~  阅读(30)  评论(0编辑  收藏  举报