在 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-id
client-secret: your-github-client-secret
scope: read:user,user:email
authorization-grant-type: authorization_code
redirect-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 {
@Bean
public 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),适用于各种第三方认证平台。这种方式不仅安全,而且易于集成到微服务架构中。