Web Day 13 OAuth2 與角色授權 執行需求:CPU 可跑 。昨天我們用 JWT 做出「登入 → 發 token → 驗 token → 取得目前使用者」這套基本流程。今天要把昨天的基礎延伸成「角色授權」:讓 API 能區分「一般使用者」與「管理者」,並在端點上宣告「只有管理者能呼叫」。我們會用 FastAPI 的 Security 與 SecurityScopes 實作 OAuth2 scope 概念,並設計 require_role 與 require_admin 兩支可重複使用的相依性,後續的「預約管理系統」專案篇(Web Day 35+)會直接沿用這套設計。 引言 昨天的 JWT 認證解決了「你是誰」的問題,但還沒處理「你能做什麼」。在真實系統裡,使用者通常分幾種角色:訪客(未登入)、一般使用者(可以建立訂單、查自己的資料)、管理者(可以查所有訂單、刪除違規內容)。如果每個端點都自己寫「檢查使用者的角色」的程式碼,會出現幾個問題:第一,邏輯散落在各處,難以統一審查;第二,新人很容易在某個端點忘了檢查角色,導致權限漏洞;第三,OAuth2 規範定義的 scope 概念無法落實。 「授權」(authorization)和「認證」(authentication)是兩件事。認證是「你是誰」,授權是「你能做什麼」。昨天的 JWT 處理認證,今天處理授權。常見的授權模型有 RBAC(Role-Based Access Control)與 ABAC(Attribute-Based Access Control),前者以角色為中心、後者以屬性為中心。我們今天用 RBAC,因為它最直覺、SQL 表格也簡單,適用於大多數後端系統。RBAC 的優點是角色數量通常很少(管理員、一般使用者、編輯者等),新增角色只要加 enum 值;缺點是當業務複雜度提升,「角色」與「權限」變得多對多時,維護成本會迅速上升。ABAC 則是用條件表達式(例如「使用者只能改自己的資料」「管理者只能改同部門的資料」),靈活度高但實作複雜,適合企業級應用。多數新專案從 RBAC 開始,等真的碰到複雜情境再升級,是務實的選擇。 今天的目標有三個:第一,把昨天的 User 模型擴充成支援角色(用 enum);第二,設計 require_role(...) 與 requ...