SpringSecurity-spring security单点登录

发布于:2025-07-19 ⋅ 阅读:(14) ⋅ 点赞:(0)

在 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-idclient-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 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),适用于各种第三方认证平台。这种方式不仅安全,而且易于集成到微服务架构中。


网站公告

今日签到

点亮在社区的每一天
去签到