• 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字段)
  • 相关阅读:
    利用DllPlugin性能优化
    Shimming 的作用
    用webpackPrefetch:true提升性能
    webpack打包分析学习笔记
    分块打包学习笔记
    tree shaking学习笔记
    Map与实体类相互转换
    项目可以run但不能debug
    jeecg-boot框架默认create_time Desc去掉
    List<实体类>根据多个字段去重
  • 原文地址:https://www.cnblogs.com/ZhZhang12138/p/14875876.html
Copyright © 2020-2023  润新知