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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM