• DRF内置权限组件之自定义权限管理类


    DRF内置权限组件permissions

    权限控制可以限制用户对于视图的访问和对于具体数据对象的访问。

    • 在执行视图的dispatch()方法前,会先进行视图访问权限的判断
    • 在通过get_object()获取具体对象时,会进行模型对象访问权限的判断

    在settings.py中设置DRF内置的权限组件的配置信息:

    DRF提供了四种权限划分

    REST_FRAMEWORK = {
        ...
        'DEFAULT_PERMISSION_CLASSES': (
            
            # 一、默认用户对所有的业务都有操作权限,即没有权限限制(未指明时默认的权限)
    		'rest_framework.permissions.AllowAny',
            
            # 二、仅通过认证的用户才可以访问项目中的接口
            'rest_framework.permissions.IsAuthenticated',
            
            # 三、仅管理员用户(可以通过admin创建一个用户进行测试)
            'rest_framework.permissions.IsAdminUser',
            
            # 四、未认证的用户只有查权限,经过认证的用户才有增删改的权限
            'rest_framework.permissions.IsAuthenticatedOrReadOnly',
            
        ),
        
    }
    

    以上这种全局配置方式,表示用户在访问项目中的所有接口时都有权限限制。

    当然,我们可以进行局部配置,在指定的类视图中通过 permission_classes 属性配置权限管理类

    permission_classes = [IsAuthenticated, ]

    from rest_framework.views import APIView
    from rest_framework.permissions import IsAuthenticated
    
    
    class ExampleView(APIView):
        
        permission_classes = [IsAuthenticated,]
    

    自定义权限管理类

    如需自定义权限,需继承 rest_framework.permissions.BasePermission 父类,并实现以下两个任何一个方法或全部

    • .has_permission(self, request, view)

      是否可以访问视图, view表示当前视图对象

    • .has_object_permission(self, request, view, obj)

      是否可以访问数据对象, view表示当前视图, obj为数据对象

    例如:

    在当前子应用下的utils文件夹中,创建一个权限文件permissions.py中声明自定义权限类:

    from rest_framework.permissions import BasePermission
    
    
    class IsXiaoMingPermission(BasePermission):
        
        def has_permission(self, request, view):
            
            print(request)  # 局部配置下的打印结果:<rest_framework.request.Request object at 0x112041c50>
            
            print(view)     # 局部配置下的打印结果:<four.views.StudentViewSet object at 0x111f8a110>
                
            if( request.user.username == "xiaoming" ):
                
                return True
    

    全局配置

    用户在访问项目中的所有接口时都有 IsXiaoMingPermission 此权限管理限制。

    REST_FRAMEWORK = {
        ...
        'DEFAULT_PERMISSION_CLASSES': (
            'four.utils.permissions.IsXiaoMingPermission',
        )
        ... 
    }       
    

    局部配置

    from four.utils.permissions import IsXiaoMingPermission
    
    
    class StudentViewSet(ModelViewSet):
        queryset = Student.objects.all()
        serializer_class = StudentSerializer
        
        permission_classes = [IsXiaoMingPermission,]
    
  • 相关阅读:
    电商总结(六)系统容量预估
    Nginx 和 IIS 实现动静分离
    聊一聊PV和并发
    RabbitMQ学习系列(四): 几种Exchange 模式
    RabbitMQ学习系列(三): C# 如何使用 RabbitMQ
    RabbitMQ学习系列(二): RabbitMQ安装与配置
    RabbitMQ学习系列(一): 介绍
    推荐:《部落 一呼百应的力量》
    Solr学习总结(八)IK 中文分词的配置和使用
    常用的数据统计Sql 总结
  • 原文地址:https://www.cnblogs.com/fengting0913/p/13489595.html
Copyright © 2020-2023  润新知