Django REST framework中認證和許可權的使用方法

來一串八二年的葡萄乾發表於2020-11-04

Django REST framework中認證和許可權的使用方法

認證方式:

  • 基本認證
  • 會話認證(SessionAuthentication)
  • 令牌認證(TokenAuthentication)

基本認證:
此身份驗證方案使用HTTP基本身份驗證,該身份針對使用者的使用者名稱和密碼進行了簽名。基本身份驗證通常僅適用於測試。
如果成功通過身份驗證request.user將是DjangoUser例項。
未經授權的身份驗證的響應將被拒絕 HTTP 401 Unauthorized

會話認證(SessionAuthentication):
此身份驗證方案使用Django的預設會話後端進行身份驗證。會話身份驗證適用於在與您的網站相同的會話上下文中執行的AJAX客戶端。

如果成功通過身份驗證request.user將是DjangoUser例項。

未經授權的身份驗證的響應將被拒絕HTTP 403 Forbidden。

令牌認證(TokenAuthentication)
此身份驗證方案使用簡單的基於令牌的HTTP身份驗證方案。令牌認證適用於客戶端-伺服器設定,例如本機桌上型電腦和移動客戶端。

為了使客戶端進行身份驗證,令牌金鑰應包含在AuthorizationHTTP標頭中。金鑰應以字串文字“ Token”作為字首,並用空格分隔兩個字串。例如:

Authorization:Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

認證失敗會有兩種可能的返回值:

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

認證全域性設定
可以在配置檔案中配置全域性預設的認證方案,配這裡是應用在全域性的

REST_FRAMEWORK = {
    # 預設的認證列表: session
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',  # session認證
    )
}

因為 認證一般都是和許可權配合使用,當我們不設定許可權時,是沒有任何效果的。為了讓大家看到最佳效果,我們額外新增一條配置資訊。配置資訊的意思是 只有認證登入使用者才可以訪問檢視

REST_FRAMEWORK = {
    # 預設的認證列表: session
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
    ],
    # 預設的許可權列表: 只有登入使用者才可以訪問
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

指定檢視認證設定
我們也可以在每個檢視中通過設定authentication_classess屬性來設定

from book.models import BookInfo
from book.serializers import BookInfoModelSerializer
from rest_framework.viewsets import ModelViewSet
from rest_framework.authentication import TokenAuthentication


class BookModelViewSet(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer

    #單個檢視,設定單獨認證方式
    authentication_classes = [TokenAuthentication]

單個檢視進行認證,僅對該檢視有效。

許可權Permissions

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

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

1.許可權的種類

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

2.使用
可以在配置檔案中設定預設的許可權管理類,如

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',# 僅通過認證的使用者
    )
}

如果未指明,則採用如下預設配置:

'DEFAULT_PERMISSION_CLASSES': (
   'rest_framework.permissions.AllowAny',
)

也可以在具體的檢視中通過permission_classes屬性來設定,如

from book.models import BookInfo
from book.serializers import BookInfoModelSerializer
from rest_framework.viewsets import ModelViewSet
from rest_framework.authentication import SessionAuthentication

class BookModelViewSet(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer

    #單個檢視,設定單獨認證方式
    authentication_classes = [SessionAuthentication]
    permission_classes = [AllowAny]

3.指定檢視設定(僅在該檢視生效)

from book.models import BookInfo
from book.serializers import BookInfoModelSerializer
from rest_framework.viewsets import ModelViewSet
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import AllowAny

class BookModelViewSet(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer

    #單個檢視,設定單獨認證方式
    authentication_classes = [SessionAuthentication]
    #設定單獨的許可權
    permission_classes = [AllowAny]

相關文章