1. 程式人生 > >restframework許可權,認證,限流配置

restframework許可權,認證,限流配置

認證Authentication

DRF框架的預設全域性認證方案如下:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',  # session認證
        'rest_framework.authentication.BasicAuthentication',   # 基本認證
    )
}

也可以在每個檢視中通過設定authentication_classess屬性來設定檢視的認證方案:

from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.views import APIView

class ExampleView(APIView):
    authentication_classes = (SessionAuthentication, BasicAuthentication)
    ...

配合許可權,如果認證失敗會有兩種可能的返回值:

  • 401 Unauthorized 未認證
  • 403 Permission Denied 許可權被禁止

許可權Permissions

許可權控制可以限制使用者對於檢視的訪問和對於具體資料物件的訪問。

  • 在執行檢視的dispatch()方法前,會先進行檢視訪問許可權的判斷
  • 在通過get_object()獲取具體物件時,會進行物件訪問許可權的判斷

提供的許可權

DRF框架提供了四個許可權控制類:

  • AllowAny 允許所有使用者
  • IsAuthenticated 僅通過認證的使用者
  • IsAdminUser 僅管理員使用者
  • IsAuthenticatedOrReadOnly 認證的使用者可以完全操作,否則只能get讀取

使用

DRF框架的預設許可權控制如下:

'DEFAULT_PERMISSION_CLASSES': (
   'rest_framework.permissions.AllowAny', # 允許所有人
)

可以在配置檔案中設定許可權管理類,如:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated', # 允許認證使用者
    )
}

也可以在具體的檢視中通過permission_classes屬性來指定某個檢視所使用的許可權控制類,如:

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView

class ExampleView(APIView):
    permission_classes = [IsAuthenticated]
    ...

舉例

from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import ReadOnlyModelViewSet

class BookInfoViewSet(ReadOnlyModelViewSet):
    # 指定當前檢視所使用的查詢集
    queryset = BookInfo.objects.all()
    # 指定當前檢視所使用的序列化器類
    serializer_class = BookInfoSerializer
    # 指定當前檢視所使用的認證類
    authentication_classes = [SessionAuthentication]
    # 指定當前檢視所使用的許可權控制類
    permission_classes = [IsAuthenticated]

自定義許可權

如需自定義許可權,需繼承rest_framework.permissions.BasePermission父類,並實現以下兩個任何一個方法或全部

  • .has_permission(self, request, view)

    是否可以訪問檢視, view表示當前檢視物件

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

    是否可以訪問資料物件, view表示當前檢視, obj為資料物件

例如:

class MyPermission(BasePermission):
    def has_permission(self, request, view):
        """判斷對使用此許可權類的檢視是否有訪問許可權"""
        # 任何使用者對使用此許可權類的檢視都沒有訪問許可權
        return True

    def has_object_permission(self, request, view, obj):
        """判斷對使用此許可權類檢視某個資料物件是否有訪問許可權"""
        # 需求: 對id為1,3的資料物件有訪問許可權
        if obj.id in (1, 3):
            return True
        return False

class BookInfoViewSet(ReadOnlyModelViewSet):
    # 指定當前檢視所使用的查詢集
    queryset = BookInfo.objects.all()
    # 指定當前檢視所使用的序列化器類
    serializer_class = BookInfoSerializer
    # 指定當前檢視所使用的認證類
    authentication_classes = [SessionAuthentication]
    # 使用自定義的許可權控制類
    permission_classes = [MyPermission]

限流Throttling

可以對介面訪問的頻次進行限制,以減輕伺服器壓力。

使用

DRF框架預設沒有進行全侷限流設定,可以在配置檔案中,使用DEFAULT_THROTTLE_CLASSES 和 DEFAULT_THROTTLE_RATES進行全域性配置。

可選限流類

1) AnonRateThrottle

限制所有匿名未認證使用者,使用IP區分使用者。

使用DEFAULT_THROTTLE_RATES['anon'] 來設定頻次

2)UserRateThrottle

限制認證使用者,使用User id 來區分。

使用DEFAULT_THROTTLE_RATES['user'] 來設定頻次

3)ScopedRateThrottle

限制使用者對於每個檢視的訪問頻次,使用ip或user id。

限流設定

1)針對匿名使用者和認證使用者分別進行限流控制

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        # 針對未登入(匿名)使用者的限流控制類
        'rest_framework.throttling.AnonRateThrottle',
        # 針對登入(認證)使用者的限流控制類
        'rest_framework.throttling.UserRateThrottle'
    ),
    # 指定限流頻次
    'DEFAULT_THROTTLE_RATES': {
        # 認證使用者的限流頻次
        'user': '5/minute',
        # 匿名使用者的限流頻次
        'anon': '3/minute',
    },
}

DEFAULT_THROTTLE_RATES 可以使用 secondminutehour 或day來指明週期。

也可以在具體檢視中通過throttle_classess屬性來配置,如

from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView

class ExampleView(APIView):
    throttle_classes = [UserRateThrottle]
    ...

2)針對匿名使用者和認證使用者進行統一的限流控制

REST_FRAMEWORK = {
    # 針對匿名使用者和認證使用者進行統一的限流控制
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.ScopedRateThrottle',
    ),

    # 指定限流頻次選擇項
    'DEFAULT_THROTTLE_RATES': {
        'upload': '3/minute',
        'contacts': '5/minute'
    },
}

例如:

class ContactListView(APIView):
    throttle_scope = 'contacts'
    ...

class ContactDetailView(APIView):
    throttle_scope = 'contacts'
    ...

class UploadView(APIView):
    throttle_scope = 'uploads'
    ...