首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring Boot 整合 Spring Security + CAS 實現單點登入 (SSO) 完整配置指南

     編輯:Java 相關知識

前言

CAS (Central Authentication Service) 是企業級單點登入標準協議。Spring Boot 整合 Spring Security CAS 模組,可快速實現應用接入 CAS Server 的認證、登出、代理票據驗證。本文提供基於 Spring Boot 2.x/3.x 的完整配置類、屬性綁定、自定義 UserDetailsService、權限映射全流程。

架構流程

  1. 用戶訪問受保護資源 → Spring Security 攔截 → 重定向至 CAS Server /login?service=...。
  2. 用戶在 CAS 登入成功 → CAS 重定向回應用 /login?ticket=ST-xxx。
  3. Spring Security CasAuthenticationFilter 攔截 Ticket → CasAuthenticationProvider 驗證 Ticket (調用 CAS /p3/serviceValidate) → 獲取用戶屬性 → 載入本地權限 → 建立 Authentication。
  4. 單點登出:應用 /logout → CAS /logout → 通知所有應用銷毀 Session (SingleSignOutFilter)。

1. Maven 依賴

cas:
  server:
    url: https://sso.example.com:8443/cas
    login-url: ${cas.server.url}/login
    logout-url: ${cas.server.url}/logout?service=${app.url}
  client:
    service-url: https://app.example.com:8080
    login-url: /login/cas
    logout-url: /logout/cas

app:
  url: https://app.example.com:8080

3. 屬性配置類


4. 核心 Security 配置類


5. 自定義 UserDetailsService:Ticket 驗證後載入權限

6. Spring Boot 3.x / Spring Security 6 寫法差異

 logout.permitAll())
        .exceptionHandling(ex -> ex.authenticationEntryPoint(casAuthenticationEntryPoint()))
        .addFilter(casAuthenticationFilter())
        .addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class)
        .addFilterBefore(casLogoutFilter(), LogoutFilter.class)
        .csrf(csrf -> csrf.disable())
        .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED));
    return http.build();
}

7. CAS Server 端配置要點 (應用註冊)

  • 在 CAS Server 註冊服務 (Service Definition):serviceId = https://app.example.com:8080/**。
  • 配置屬性釋放策略:返回 principal (用戶名)、email、roles 等屬性。
  • 啟用單點登出回調:CAS 需向每個應用發送 SAML 登出請求 (/samlLogout),應用端 SingleSignOutFilter 處理。

常見問題排查

總結

Spring Boot 整合 CAS 核心在於:**ServiceProperties 定義服務身份、CasAuthenticationFilter 攔截 Ticket、CasAuthenticationProvider 驗證 Ticket 並委託 AuthenticationUserDetailsService 載入權限、SingleSignOutFilter 處理單點登出**。配置雖多但邏輯清晰,掌握各 Bean 職責與 CAS 協議交互流程,可快速定位 SSO 接入問題。生產環境建議補全:HTTPS 雙向信任、集群 Session 共享、CAS 代理票據授權、登出回調可靠性保障。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象原因/解決
Ticket 驗證失敗: "Ticket not recognized"Service URL 不匹配 (含/不含尾斜線、HTTP/HTTPS、端口)。確保 serviceProperties.setService 與 CAS 註冊的 serviceId 完全一致。
無限重定向登入頁Ticket 驗證成功但 AuthenticationUserDetailsService 拋異常/返回 null,導致 Security 認為未認證。檢查日誌、斷點調試。
單點登出不生效1) CAS Server 未配置該應用的登出回調 URL。2) 應用缺少 SingleSignOutFilter 或順序錯誤。3) 會話追蹤依賴 sessionMappingStorage (預設內存),集群需共享存儲 (Redis/JDBC)。
HTTPS 憑證信任應用調用 CAS /p3/serviceValidate 需信任 CAS 憑證。將 CA 導入 JDK cacerts 或配置 Cas20ServiceTicketValidator.setTrustStore。