完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-16
在前幾天,我們已經能完成模型的 訓練、部署與查詢。
但問題也隨之浮現:
如果沒有權限管理,系統就會變成「誰都能亂操作」的狀態。今天的任務,就是透過 JWT 認證 與 RBAC(基於角色的存取控制),為平台加上「安全性」與「多角色管理」的基礎
多使用者環境
資源隔離
安全與可追溯
403 Forbidden
整個平台採用 JWT (JSON Web Token) 作為核心認證機制。
使用者登入後,會獲得一張帶有角色資訊的「通行證」,後續請求都必須帶上這個 Token。
流程大致如下:
使用者登入,伺服器驗證帳號密碼。
伺服器簽發一個 JWT,內含:
{
"user_id": "u123",
"role": "user",
"exp": 1735640400
}
後續 API 請求需在 Header 加上:
Authorization: Bearer <token>
系統驗證 token → 合法則放行,否則回傳 401 Unauthorized
。
這種設計的好處是 無狀態(Stateless),後端不用保存 session,容易擴展。
我把權限分成三層:
基本認證
401 Unauthorized
角色限制
403 Forbidden
資源所有權
task_id
是否屬於該使用者端點 | 方法 | 權限要求 | 說明 |
---|---|---|---|
/login |
POST | 無 | 登入,回傳 JWT token |
/train |
POST | 已認證用戶 | 提交訓練任務 |
/task/{task_id} |
GET | 任務所有者 | 查詢任務狀態 |
/experiments |
GET | 管理員 | 列出所有實驗記錄 |
/experiments/stats |
GET | 管理員 | 查詢實驗統計資訊 |
/experiments/{id} |
GET | 任務所有者 | 查詢單一實驗紀錄 |
Day 16 的核心收穫,是讓平台正式邁向 多人共用 的環境。
使用者能安全地提交與查詢自己的任務,管理員則具備全面監控的能力。
這不僅避免了資源濫用,也讓 API 的錯誤回應更加一致、可預測。
如果說前幾天的重點是「系統能跑起來」,那麼今天的重點就是「系統能安全地讓多人一起使用」。接下來的 Day 17(審計日誌 Audit Log),會在這套機制上再進一步,確保每一個操作都有跡可循。
📎 AI 協作記錄:今日開發指令
1. 新增 JWT 工具模組
功能:
- create_token(user_id, role)
- decode_token(token)
- get_current_user
- check_admin
- check_task_owner
2. 在 FastAPI 主程式新增登入 API
修改內容:
- 新增 /login API,接收 username/password
- 判斷角色(admin or user)
- 使用 jwt_utils 建立並回傳 JWT Token
3. 保護既有任務 API
修改內容:
- 在 /train 與 /task/{id} 前加上依賴:
- get_current_user
- check_admin(只有 admin 能查詢全部)
- check_task_owner(user 僅能查詢自己的任務)