CallIT 透過 django-auth-ldap 接 Windows AD 做無縫登入,認證成功後發 HttpOnly Cookie(JWT 或 Session Token)防 XSS 提取。

流程

sequenceDiagram
    participant U as 前端 (React)
    participant API as 後端 api/
    participant LDAP as AD / LDAP
    participant SVC as service/

    U->>API: POST /login {帳號, 密碼}
    API->>LDAP: bind(帳號, 密碼)
    LDAP-->>API: 認證成功 + AD Group 資訊
    API->>SVC: determineRole(user, AD Groups)
    SVC-->>API: User / 行政 / 主官管 / IT
    API-->>U: Set-Cookie: token=...; HttpOnly; Secure
    U->>API: 後續請求自動帶 cookie

關鍵設計

設計 為什麼
python-ldap 直連通訊協定 避開 COM 元件層級異常(舊系統痛點)
HttpOnly Cookie JS 拿不到 token → 阻 XSS
Secure flag 強制 HTTPS 傳輸
角色判定在 service/ 集中授權邏輯

角色映射

AD Group資料庫白名單判定 4 種角色:User / 行政 / 主官管 / IT。

後續權限驗證

每個 API 請求都會:

  1. 解析 cookie 拿 token
  2. 驗 token 有效性
  3. 在 service 層重新檢查 request.user 是否具備對應角色(防越權)

刪除/編輯 API 尤其要做這層檢查 — 不能只信前端 UI 把按鈕藏起來。

跟舊系統的差別

舊(ASP.NET Web Forms) 新(Django + LDAP)
AD 連線方式 透過 COM 元件 python-ldap 直連
Token 存放 LocalStorage / Session HttpOnly Cookie
角色判定位置 散落各 page 集中在 service/determineRole
穩定性 COM 異常會整個炸 通訊協定層級失敗有錯誤訊息可控

相關概念

強連結

推斷連結