Django REST Framework (DRF) 認證方式、預設權限規則|新手指南
更新日期: 2025 年 1 月 29 日
本文為 Django 登入註冊功能(後端)系列文,第 5 篇
- 新手指南|使用 Django 實現後端會員登入、註冊功能
- Django Rest Framework (DRF) 新手指南:為什麼選擇 DRF 建構 API?
- Django Rest Framework (DRF) 新手指南:用 ViewSets 快速構建 CRUD API
- 初學者指南:理解 Token 認證及其運作方式
- Django REST Framework (DRF) 認證方式、預設權限規則|新手指南 👈所在位置
- Django Rest Framework 入門指南:如何正確處理 HTTP 狀態碼
- 初學者指南:深入了解 Django 的 create_user 方法
- 新手指南:深入了解 Django 的 authenticate 方法
- Django REST Framework|@permission_classes指導手冊
- 使用 Postman 測試 Django 後端的註冊、登入與登出功能
在使用 Django REST Framework (DRF) 開發 API 時,設置全域設定(Global Settings)是讓專案具備穩定性與安全性的關鍵步驟。
這些設定可以定義整個專案的 認證方式 和 預設權限規則,確保 API 的訪問符合開發需求。
本文將一步步拆解 DRF 的兩個重要全域設定:DEFAULT_AUTHENTICATION_CLASSES
和 DEFAULT_PERMISSION_CLASSES
,幫助新手了解其作用及應用。
認證機制:DEFAULT_AUTHENTICATION_CLASSES
什麼是認證機制?
認證機制負責確認 API 請求的身份,換句話說,後端需要知道 誰 發出了請求,以及請求是否有效。
程式碼範例
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
],
這段程式碼表示 DRF 預設使用 TokenAuthentication
來驗證 API 請求的身份。
認證機制的作用與運作方式
作用
在處理 API 請求時,認證機制的目的是回答以下問題:
- 使用者是否已登入?
- 提供的憑證(如 Token)是否有效?
如果未通過身份驗證,API 請求會被拒絕並返回 401 Unauthorized。
運作方式:以 Token 為例
- 使用者登入後,後端生成一個唯一的 Token 並回傳給使用者。
- 使用者發送 API 請求時,將 Token 附在 HTTP 標頭的
Authorization
欄位中,格式如下:
Authorization: Token <your-token>
- 後端接收請求並驗證 Token 的有效性,確認請求的合法性。
常見的認證方式
- TokenAuthentication:
- 基於 Token 的認證。
- DRF 內建功能,但需要搭配
rest_framework.authtoken
使用。
- SessionAuthentication:
- 使用 Django 內建的 Session 機制。
- 適用於傳統頁面渲染的情境。
- 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。
常見的權限類別
- AllowAny:
- 允許所有請求,包括未登入的使用者。
- IsAuthenticated:
- 要求使用者登入才能訪問。
- IsAdminUser:
- 僅限管理員(superuser)訪問。
- 自訂權限:
- 繼承
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,例如個人資料或敏感操作。
實際應用:前後端分離專案的好處
前後端分離專案中,這些全域設定可以清楚地劃分前後端責任:
- 前端:負責在 API 請求中附加 Token。
- 後端:通過 Token 驗證身份,並根據權限規則控制資源的訪問。
這樣的設計不僅提升了安全性,還能保證系統的彈性與可維護性。
總結
DEFAULT_AUTHENTICATION_CLASSES
:- 定義 API 如何辨識使用者身份(如使用 Token)。
- 確保只有提供有效憑證的使用者才能訪問 API。
DEFAULT_PERMISSION_CLASSES
:- 定義 API 的訪問規則(如要求登入)。
- 防止未授權使用者訪問敏感資源。
設定這些全域配置,不僅能確保 API 安全性,還能減少開發者的重複工作,是建立穩定、可靠後端的關鍵一步!