java如何实现单点登录
单点登录(SSO)的基本原理
单点登录允许用户通过一次认证访问多个相互信任的应用系统。核心机制是认证中心(CAS Server)负责签发令牌(Token),应用系统(CAS Client)通过验证令牌实现免登录。
基于CAS协议的实现
CAS(Central Authentication Service)是常用的SSO开源协议,以下是Java实现步骤:
-
部署CAS Server
- 使用官方提供的
cas-overlay-template项目快速搭建认证中心。 - 修改
application.properties配置数据库、LDAP等认证源。# Maven依赖示例 <dependency> <groupId>org.apereo.cas</groupId> <artifactId>cas-server-webapp</artifactId> <version>6.6.0</version> </dependency>
- 使用官方提供的
-
集成CAS Client
-
在应用系统中添加CAS Client依赖,配置过滤器和回调地址。

// Spring Boot配置示例 @Configuration public class CasConfig { @Value("${cas.server.url}") private String casServerUrl; @Bean public FilterRegistrationBean<AuthenticationFilter> casFilter() { FilterRegistrationBean<AuthenticationFilter> reg = new FilterRegistrationBean<>(); reg.setFilter(new AuthenticationFilter()); reg.addInitParameter("casServerLoginUrl", casServerUrl + "/login"); reg.addInitParameter("serverName", "https://your-app.com"); reg.addUrlPatterns("/*"); return reg; } }
-
基于OAuth2/OpenID Connect的实现
适用于现代分布式架构,如Spring Security OAuth2:
-
搭建授权服务器
- 使用
spring-security-oauth2-authorization-server或Keycloak等第三方服务。@Bean public RegisteredClientRepository registeredClientRepository() { RegisteredClient client = RegisteredClient.withId("client1") .clientSecret("{noop}secret") .scope("read") .redirectUri("https://client-app.com/login/oauth2/code/custom") .build(); return new InMemoryRegisteredClientRepository(client); }
- 使用
-
资源服务器配置

- 在应用系统中验证JWT令牌并提取用户信息。
@EnableWebSecurity public class SecurityConfig { @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())); return http.build(); } }
- 在应用系统中验证JWT令牌并提取用户信息。
基于JWT的无状态SSO
适用于微服务场景,无需依赖会话存储:
-
生成和验证JWT
- 使用
jjwt库创建包含用户信息的令牌。String token = Jwts.builder() .setSubject("user1") .signWith(SignatureAlgorithm.HS256, "secret-key") .compact();
- 使用
-
跨域共享Token
- 通过Cookie或前端存储(如localStorage)传递JWT,各服务通过公钥验证签名。
注意事项
- 安全性:所有通信需使用HTTPS,避免令牌泄露。
- 令牌有效期:设置较短的JWT过期时间,结合Refresh Token机制。
- 单点登出:CAS支持全局登出,OAuth2需依赖Token撤销接口。
参考实现可选择:






