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,]
posted @ 2020-08-12 11:24  嗨,阿良  阅读(1605)  评论(0编辑  收藏  举报