🎯 目標
為 API 與 Dashboard 加入 身份驗證與授權
強化 資料保護(使用者資料、偏好、藥物清單等個資)
加入 角色/權限管理(一般使用者 vs 管理員)
增加 token 過期機制,避免長期未登出造成風險
🏗️ 技術設計
1. 使用 Spring Security
引入 spring-boot-starter-security
最小化設定:
/api/users/register, /api/users/login → 允許匿名訪問
/api/** → 需要 JWT 或 session
/api/admin/** → 限制角色為 ADMIN
2. JWT 驗證流程
登入成功後簽發 JWT(含 user_id, role, 過期時間 exp)
每次 API 請求帶 Authorization: Bearer <token>
後端 Filter 驗證 JWT → 決定是否允許存取
3. 資料保護
使用者密碼:BCryptPasswordEncoder 雜湊儲存
Drug 清單、偏好食物等屬於個資 → 資料庫可加密欄位(最小化先 hash/salt)
前端:避免敏感資訊直接顯示
4. 權限管理
ROLE_USER:
可查詢效果、推薦、解釋、個人化 API
ROLE_ADMIN:
除上述外,可存取 /api/admin/reload-models、資料匯入 API
可檢查 DB 狀態
5. Token 管理
JWT 過期時間:例如 2 小時
Refresh Token 機制(可選,Day26 先不做,後續再擴充)
未授權存取時 → 回傳 401 Unauthorized
🧪 測試計畫
匿名存取 /api/recommendations → 回傳 401 Unauthorized
登入取得 token → 請求 /api/recommendations 成功
用一般帳號請求 /api/admin/reload-models → 回傳 403 Forbidden
Admin 帳號可成功 reload
Token 過期 → 再次請求 → 自動拒絕
✅ 驗收標準
系統能正確區分 未登入 / 一般使用者 / 管理員
API 與 Dashboard 受保護,避免匿名濫用
使用者資料(特別是藥物清單)不會明碼存放
Token 過期後需重新登入