在 Spring Boot 中实现 单点登录(SSO, Single Sign-On),通常使用 OAuth2 或 OIDC(OpenID Connect) 协议来完成。Spring Security 提供了对 OAuth2 和 OIDC 的完整支持,可以轻松集成如 Google、GitHub、Okta、Auth0、Keycloak 等第三方认证服务。
一、单点登录(SSO)简介
- 用户只需登录一次,即可访问多个系统。
- 常见实现方式:使用 OAuth2 + OIDC。
- Spring Security 提供了
spring-security-oauth2-client
模块支持 SSO。
二、开发步骤总览
步骤 | 内容 |
---|---|
1️⃣ | 引入依赖(OAuth2 Client) |
2️⃣ | 配置 OAuth2 客户端信息(如 GitHub) |
3️⃣ | 配置安全策略(SecurityFilterChain) |
4️⃣ | 创建登录成功后的用户信息接口 |
5️⃣ | 启动项目并测试 SSO 登录流程 |
三、具体代码实现
1️⃣ 引入依赖(pom.xml
)
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-oauth2-client</artifactId>
</dependency>
2️⃣ 配置 OAuth2 客户端信息(application.yml
)
以 GitHub 为例,配置 OAuth2 客户端信息:
spring:security:oauth2:client:registration:github:client-id: your-github-client-idclient-secret: your-github-client-secretscope: read:user,user:emailauthorization-grant-type: authorization_coderedirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"client-name: GitHub
你需要先在 GitHub 创建 OAuth App,获取
client-id
和client-secret
:
- GitHub 地址:https://github.com/settings/applications/new
3️⃣ 配置安全策略(SecurityFilterChain)
@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated()).oauth2Login(withDefaults()); // 启用 OAuth2 登录return http.build();}
}
oauth2Login()
:启用 OAuth2 登录流程。- 默认会跳转到 GitHub 的登录页面。
- 登录成功后会跳转到
/login/oauth2/code/github
。
4️⃣ 创建登录成功后的用户信息接口
@RestController
public class UserController {@GetMapping("/user")public Principal user(Principal principal) {return principal;}@GetMapping("/login")public String login() {return "Redirecting to OAuth2 login...";}
}
/user
接口返回当前登录用户信息(来自 GitHub)。Principal
包含了用户的基本信息(如用户名、头像、邮箱等)。
四、运行流程说明
用户访问应用 → 未登录 → 跳转到 GitHub 登录页↓
用户输入 GitHub 账号密码 → GitHub 认证 → 授权回调到你的应用↓
应用获取用户信息 → 登录成功 → 跳转到首页↓
后续请求自动携带 OAuth2 Token → 访问受保护资源
五、扩展:自定义登录成功处理逻辑
你可以自定义登录成功后的跳转逻辑:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated()).oauth2Login(oauth2 -> oauth2.successHandler((request, response, authentication) -> {System.out.println("登录成功:" + authentication.getName());response.sendRedirect("/user");}));return http.build();
}
六、其他 OAuth2 提供商支持
提供商 | 配置名 | 示例 |
---|---|---|
GitHub | github | 如上 |
google | client-id , client-secret | |
Okta | okta | 需配置 issuer-uri |
Keycloak | 自定义 OIDC | 使用 spring.security.oauth2.client.provider 配置 |
七、总结:Spring Boot + Spring Security 实现 SSO 的关键点
步骤 | 说明 |
---|---|
引入依赖 | spring-security-oauth2-client |
配置客户端 | 在 application.yml 中配置第三方 OAuth2 信息 |
启用 OAuth2 登录 | 使用 .oauth2Login() |
获取用户信息 | 通过 Principal 获取 |
自定义逻辑 | 可通过 successHandler 自定义登录成功行为 |
支持平台 | GitHub、Google、Okta、Keycloak 等 |
八、完整流程图
引入依赖↓
配置 OAuth2 客户端(GitHub)↓
启用 oauth2Login()↓
用户访问受保护资源 → 跳转 GitHub 登录↓
GitHub 登录成功 → 回调到 /login/oauth2/code↓
获取用户信息 → 登录成功↓
访问 /user 获取用户信息
通过以上步骤,可以轻松在 Spring Boot 项目中实现 基于 OAuth2 的单点登录(SSO),适用于各种第三方认证平台。这种方式不仅安全,而且易于集成到微服务架构中。