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