Django REST Framework (DRF) 認證方式、預設權限規則|新手指南

更新日期: 2025 年 1 月 29 日

在使用 Django REST Framework (DRF) 開發 API 時,設置全域設定(Global Settings)是讓專案具備穩定性與安全性的關鍵步驟。

這些設定可以定義整個專案的 認證方式預設權限規則,確保 API 的訪問符合開發需求。

本文將一步步拆解 DRF 的兩個重要全域設定:DEFAULT_AUTHENTICATION_CLASSESDEFAULT_PERMISSION_CLASSES,幫助新手了解其作用及應用。


認證機制:DEFAULT_AUTHENTICATION_CLASSES

什麼是認證機制?

認證機制負責確認 API 請求的身份,換句話說,後端需要知道 發出了請求,以及請求是否有效。

程式碼範例

'DEFAULT_AUTHENTICATION_CLASSES': [
    'rest_framework.authentication.TokenAuthentication',
],

這段程式碼表示 DRF 預設使用 TokenAuthentication 來驗證 API 請求的身份。

認證機制的作用與運作方式

作用

在處理 API 請求時,認證機制的目的是回答以下問題:

  • 使用者是否已登入?
  • 提供的憑證(如 Token)是否有效?

如果未通過身份驗證,API 請求會被拒絕並返回 401 Unauthorized

運作方式:以 Token 為例

  1. 使用者登入後,後端生成一個唯一的 Token 並回傳給使用者。
  2. 使用者發送 API 請求時,將 Token 附在 HTTP 標頭的 Authorization 欄位中,格式如下:
Authorization: Token <your-token>
  1. 後端接收請求並驗證 Token 的有效性,確認請求的合法性。

常見的認證方式

  1. TokenAuthentication
    • 基於 Token 的認證。
    • DRF 內建功能,但需要搭配 rest_framework.authtoken 使用。
  2. SessionAuthentication
    • 使用 Django 內建的 Session 機制。
    • 適用於傳統頁面渲染的情境。
  3. JWT (JSON Web Token)
    • 輕量化且被廣泛使用。
    • 通常需要安裝額外套件(如 SimpleJWT)。

設定這段的意圖

設定 DEFAULT_AUTHENTICATION_CLASSES 是為了明確告訴 DRF,當收到 API 請求時,該如何驗證使用者身份。

例如,使用 TokenAuthentication 時,後端會自動從請求中提取 Token 並進行驗證。


權限規則:DEFAULT_PERMISSION_CLASSES

什麼是權限規則?

權限規則用於控制通過身份驗證的使用者,是否有權訪問某些 API 資源。

程式碼範例

'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.IsAuthenticated',
],

這段程式碼設定了 所有 API 預設需要使用者登入 才能訪問。

權限規則的作用與運作方式

作用

即使一個使用者已通過認證,後端仍需檢查該使用者是否具備訪問特定資源的權限。

例如:

  • 一位使用者登入後,是否有權限檢視其他使用者的資料?
  • 一位普通使用者是否有權限進行管理員操作?

運作方式:以 IsAuthenticated 為例

  • 若 API 請求的使用者已登入,則允許訪問。
  • 若使用者未登入,API 會返回 401 Unauthorized

常見的權限類別

  1. AllowAny
    • 允許所有請求,包括未登入的使用者。
  2. IsAuthenticated
    • 要求使用者登入才能訪問。
  3. IsAdminUser
    • 僅限管理員(superuser)訪問。
  4. 自訂權限
    • 繼承 BasePermission,實現客製化的訪問控制邏輯。

範例:

from rest_framework.permissions import BasePermission

class IsOwnerOrReadOnly(BasePermission):
    def has_object_permission(self, request, view, obj):
        # 只允許物件的擁有者進行修改
        if request.method in ['GET', 'HEAD', 'OPTIONS']:
            return True
        return obj.owner == request.user

設定這段的意圖

這段設定確保 只有已登入的使用者才能訪問 API

如果需要某些公開的 API(如查詢功能),可以在特定視圖中覆蓋全域設定:

from rest_framework.permissions import AllowAny
from rest_framework.views import APIView

class PublicAPI(APIView):
    permission_classes = [AllowAny]  # 覆蓋全域設定,允許任何人訪問

不設定這些參數會怎麼樣?

不設定 DEFAULT_AUTHENTICATION_CLASSES

  • DRF 不會自動驗證身份,所有 API 請求將被視為匿名請求。
  • 開發者需要手動實現身份驗證邏輯,增加開發負擔。

不設定 DEFAULT_PERMISSION_CLASSES

  • 預設使用 AllowAny,即所有 API 可被任何人訪問。
  • 不適合需要保護的 API,例如個人資料或敏感操作。

實際應用:前後端分離專案的好處

前後端分離專案中,這些全域設定可以清楚地劃分前後端責任:

  1. 前端:負責在 API 請求中附加 Token。
  2. 後端:通過 Token 驗證身份,並根據權限規則控制資源的訪問。

這樣的設計不僅提升了安全性,還能保證系統的彈性與可維護性。


總結

  1. DEFAULT_AUTHENTICATION_CLASSES
    • 定義 API 如何辨識使用者身份(如使用 Token)。
    • 確保只有提供有效憑證的使用者才能訪問 API。
  2. DEFAULT_PERMISSION_CLASSES
    • 定義 API 的訪問規則(如要求登入)。
    • 防止未授權使用者訪問敏感資源。

設定這些全域配置,不僅能確保 API 安全性,還能減少開發者的重複工作,是建立穩定、可靠後端的關鍵一步!

Similar Posts