DRF內建許可權元件之自定義許可權管理類

嗨,阿良發表於2020-08-12

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,]

相關文章