首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

CAS 單點登錄整合異構用戶庫:以「工號」為統一鍵的架構設計

     編輯:程式設計綜合問答

業務挑戰

  • Web1/Web2/Web3 獨立用戶表,帳號/密碼各異。
  • 共同欄位:employee_id (工號),非空唯一。
  • 需實現:用戶在 CAS 登入一次,自動映射至各系統對應帳號。

架構方案:聯邦身分識別 + 即時佈建

+----------------+     +----------------+     +------------------+
|   Web1 (舊)    |     |   Web2 (舊)    |     |   Web3 (舊)      |
| user1/123      |     | zhangsan/456   |     | abc/789          |
| emp_id: 001    |     | emp_id: 001    |     | emp_id: 001      |
+-------+--------+     +-------+--------+     +--------+---------+
        |                      |                      |
        v                      v                      v
+-------+----------------------------------------------+--------+
|              CAS Server (身分提供者)                    |
|  1. 驗證 employee_id + 密碼 (統一認證源)               |
|  2. 簽發 TGT (Ticket Granting Ticket)                  |
|  3. 回調各系統 /sso/login?ticket=ST&emp_id=001         |
+-------+----------------------------------------------+--------+
        |                      |                      |
        v                      v                      v
+-------+--------+     +-------+--------+     +--------+---------+
| Web1 (新)    |     | Web2 (新)    |     | Web3 (新)        |
| 1. 驗證 ST   |     | 1. 驗證 ST   |     | 1. 驗證 ST       |
| 2. 查詢本地  |     | 2. 查詢本地  |     | 2. 查詢本地      |
|    user by   |     |    user by   |     |    user by       |
|    emp_id    |     |    emp_id    |     |    emp_id        |
| 3. 不存在則  |     | 3. 不存在則  |     | 3. 不存在則      |
|    自動建立  |     |    自動建立  |     |    自動建立      |
|    並綁定    |     |    並綁定    |     |    並綁定        |
+--------------+     +--------------+     +------------------+

關鍵實現細節

1. CAS Server 認證源

建立獨立 cas_user 表:employee_id (PK), password_hash, status。遷移時由各系統同步工號與初始密碼(或強制首次登入修改)。

2. 各系統 Filter 鏈

public class CasSsoFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
        HttpServletRequest request = (HttpServletRequest) req;
        String ticket = request.getParameter("ticket");
        String empId = request.getParameter("emp_id");
        if (StringUtils.isBlank(ticket)) {
            // 重導向 CAS 登入頁,帶上 service=本系統回調地址
            response.sendRedirect(casLoginUrl + "?service=" + URLEncoder.encode(callbackUrl));
            return;
        }
        // 1. 驗證 ST -> 獲取 employee_id (CAS SDK)
        String validatedEmpId = CasClient.validateTicket(ticket, callbackUrl);
        if (!empId.equals(validatedEmpId)) throw new SecurityException("工號不匹配");
        // 2. 即時佈建
        User localUser = userService.findByEmpId(empId);
        if (localUser == null) {
            localUser = userService.provisionFromCentral(empId); // 呼叫中心介面同步基本資料
        }
        // 3. 建立本地 Session
        request.getSession().setAttribute("CURRENT_USER", localUser);
        chain.doFilter(req, res);
    }
}

3. 登出傳播

CAS Server 單點登出:配置各系統 logoutUrl,CAS 登出時以 HTTP POST 通知各系統銷毀 Session。

遷移策略

  1. 雙寫期:新用戶同時寫入 CAS 與各系統;舊用戶首次登入觸發同步。
  2. 驗證期:並行運行一個月,比對登入日誌。
  3. 切換期:停用各系統獨立登入入口,統一入口 CAS。

此方案不修改舊系統密碼邏輯,僅在登入攔截器植入 CAS 協議,風險可控、平滑過渡。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved