欢迎光临
我们一直在努力

【SpringBoot 3.x 第60节】都 2026 年了,你还在手撸 OAuth2?Spring Boot 3 + OIDC 这一套打法,让安全不再是玄学!

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    本专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。    若还想学习更多,可直接前往《滚雪球学SpringBoot(全版本合集)》,涵盖SpringBoot所有版本教学文章。

演示环境说明:

  • 开发工具:IDEA 2021.3
  • JDK版本: JDK 17(推荐使用 JDK 17 或更高版本,因为 Spring Boot 3.x 系列要求 Java 17,Spring Boot 3.5.4 基于 Spring Framework 6.x 和 Jakarta EE 9,它们都要求至少 JDK 17。)
  • Spring Boot版本:3.5.4(于25年7月24日发布)
  • Maven版本:3.8.2 (或更高)
  • Gradle:(如果使用 Gradle 构建工具的话):推荐使用 Gradle 7.5 或更高版本,确保与 JDK 17 兼容。
  • 操作系统:Windows 11

全文目录:

      • 前言
      • 前言:为什么 OAuth 2.0 + OIDC 是 2026 年的唯一解?
      • 第一章:Spring Boot 3 作为 Resource Server——守好你的 API 大门
        • 1. 依赖引入
        • 2. 配置 application.yml
        • 3. SecurityFilterChain 配置
      • 第二章:Spring Boot 3 作为 OAuth2 Client——社交登录两行代码搞定
        • 1. 依赖引入
        • 2. 魔法配置
        • 3. 怎么用?
      • 第三章:Spring Authorization Server——当你想做“大佬”时
        • 1. 核心依赖
        • 2. 核心组件配置
      • 第四章:JWT 解析与自定义 Converter——拒绝 SCOPE_ 前缀!
        • 1. Token 结构假设
        • 2. 自定义转换器代码
        • 3. 应用到 SecurityFilterChain
      • 结语:安全不是终点,是起点
      • 🧧福利赠与你🧧
      • 🫵 Who am I?

前言

哎哟喂,兄弟们,2026 年的钟声都敲响好几天了,我这几天在 GitHub 上逛游,居然还看到有人在 Spring Boot 3 的项目里手写 Token 校验过滤器,还在用那一堆过期的 WebSecurityConfigurerAdapter(这玩意儿 2022 年就埋了吧?)。看得我这心啊,拔凉拔凉的。😭 安全这块儿,原本就是咱们后端开发最头疼的“玄学”领域——OAuth 2.0 流程绕晕人,OIDC(OpenID Connect)更是让人摸不着头脑,更别提 Spring Security 那“出了名”的配置复杂度。

但是!朋友们,时代变了。Spring Boot 3.x(配合 Spring Security 6.x)在 OAuth2 和 OIDC 的支持上,简直是坐上了火箭。以前写个认证中心得掉把头发,现在?Spring Authorization Server 官方转正,Resource Server 和 Client 配置简直丝滑得像德芙。我现在做项目,无论是接微信登录、Google 登录,还是自己搭一套 SSO(单点登录),全是标准化的 OAuth2 协议,稳如老狗,扩展性还强。

今天这篇,咱们不讲枯燥的协议规范(那玩意儿留给架构师看),我就带大家实战。咱们从资源服务器(Resource Server)、客户端(Client),聊到自己搭建认证中心(Authorization Server),最后再教你怎么把 JWT 玩出花儿来。全程基于 Spring Boot 3.3+ 标准,代码能跑,逻辑通透。准备好了吗?系好安全带,咱们冲进安全的“暴风眼”!🚀

前言:为什么 OAuth 2.0 + OIDC 是 2026 年的唯一解?

先别急着写代码,咱们得把逻辑理顺。以前我们做登录,喜欢用 Session,后来为了前后端分离搞了个简单的 Token。但现在微服务满天飞,SaaS 应用遍地走,你需要:

  • 第三方登录:用户懒得注册,想用 GitHub、微信直接登。
  • 服务间调用:A 服务调 B 服务,怎么证明身份?
  • 单点登录 (SSO):公司十几个系统,登一次全都能进。
  • 这时候,自研 Token 机制就是给自己挖坑。OAuth 2.0 解决了“授权”问题(你能干什么),OIDC 在此基础上解决了“认证”问题(你是谁)。

    Spring Boot 3 彻底抛弃了旧的 spring-security-oauth2 项目(那个早在 2020 年就停止维护了),全面拥抱新生态。现在的写法全是 Lambda DSL,干净、优雅、类型安全。不管是做 Resource Server 还是 Client,核心配置往往就几行代码。真的,别再怕它了,拥抱它,你会发现新世界。🌍

    第一章:Spring Boot 3 作为 Resource Server——守好你的 API 大门

    这是最常见的场景:你开发了一套 REST API,前端(React/Vue/App)拿着一个 JWT(JSON Web Token)来访问,你需要验证这个 Token 对不对、过没过期、有没有权限。

    在 Spring Boot 3 里,这简直简单到令人发指。

    1. 依赖引入

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    2. 配置 application.yml

    你只需要告诉 Spring Security,发 Token 的那个“大佬”(Issuer)是谁,公钥去哪拿(JWK Set URI)。

    spring:
    security:
    oauth2:
    resourceserver:
    jwt:
    # 认证中心的地址,Spring 会自动去 /.well-known/openid-configuration 拉配置
    issuer-uri: https://accounts.google.com
    # 或者直接指定 JWK 地址
    # jwk-set-uri: https://www.googleapis.com/oauth2/v3/certs

    3. SecurityFilterChain 配置

    别再找 configure(HttpSecurity http) 了,现在是 Bean 风格:

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
    .authorizeHttpRequests(authorize -> authorize
    .requestMatchers("/public/**").permitAll()
    .requestMatchers("/api/admin/**").hasAuthority("SCOPE_admin") // 注意默认是 SCOPE_ 前缀
    .anyRequest().authenticated()
    )
    .oauth2ResourceServer(oauth2 -> oauth2
    .jwt(Customizer.withDefaults()) // 开启 JWT 支持
    );
    return http.build();
    }
    }

    这就完了?对,这就完了!Spring Boot 会自动下载公钥、验证签名、解析 Claims。如果 Token 里的 iss 不对,或者时间过期,它直接甩个 401 给你。这种“开箱即用”的感觉,是不是爽翻了?😎

    第二章:Spring Boot 3 作为 OAuth2 Client——社交登录两行代码搞定

    现在的用户,看到注册表单超过 3 项就想关网页。支持 GitHub、Google 登录是标配。

    以前集成 GitHub 登录,你得自己拼 URL、换 Code、换 Token、查 UserInfo……累不累啊?Spring Boot 3 的 oauth2-client 帮你全包圆了。

    1. 依赖引入

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>

    2. 魔法配置

    Spring Boot 内置了 Google, GitHub, Facebook, Okta 等常用提供商的模板,你只需要填 ID 和 Secret。

    spring:
    security:
    oauth2:
    client:
    registration:
    github:
    client-id: Ov23li # 你的 GitHub Client ID
    client-secret: 4e9d # 你的 Secret
    scope: read:user
    google:
    client-id:
    client-secret:

    3. 怎么用?

    直接启动应用,访问 /login。Spring Security 会自动生成一个登录页,上面列出了 GitHub 和 Google 的链接。

    如果你想在代码里获取用户信息:

    @GetMapping("/")
    public String index(@AuthenticationPrincipal OAuth2User principal) {
    // principal.getAttributes() 里就是 GitHub 返回的用户信息
    String username = principal.getAttribute("login");
    return "Hello, " + username;
    }

    背后的流程(Authorization Code Grant)完全透明。Session 管理、重定向、Token 存储,框架全干了。对于咱们开发者来说,这就叫“降维打击”。

    第三章:Spring Authorization Server——当你想做“大佬”时

    这是重头戏。如果你不想依赖 Google,想给公司内部搭建一个统一认证中心(就像阿里的账号中心),以前你可能会去折腾 Keycloak(很强大但很重),或者硬着头皮用旧版 Spring Security OAuth2(已死)。

    现在,Spring Authorization Server (SAS) 是官方唯一推荐。它基于 Spring Security 6,完全符合 OAuth 2.1 草案。

    警告:这东西配置起来稍微有点复杂,因为它很灵活。

    1. 核心依赖

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
    </dependency>

    2. 核心组件配置

    你需要配置 RegisteredClientRepository(管理谁能来申请 Token)和 密钥对(用来签名 JWT)。

    @Bean
    public RegisteredClientRepository registeredClientRepository() {
    RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString())
    .clientId("my-client")
    .clientSecret("{noop}secret") // 生产环境记得加密!
    .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
    .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
    .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
    .redirectUri("http://127.0.0.1:8080/login/oauth2/code/my-client-oidc")
    .scope(OidcScopes.OPENID)
    .scope("message.read")
    .tokenSettings(TokenSettings.builder().accessTokenTimeToLive(Duration.ofHours(2)).build())
    .build();

    return new InMemoryRegisteredClientRepository(registeredClient);
    }

    还需要配置 RSA 密钥对(JWKSource),因为你需要给发出去的 JWT 签名,Resource Server 才能验签。

    @Bean
    public JWKSource<SecurityContext> jwkSource() {
    KeyPair keyPair = generateRsaKey(); // 自己写个生成 RSA 的方法
    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
    RSAKey rsaKey = new RSAKey.Builder(publicKey)
    .privateKey(privateKey)
    .keyID(UUID.randomUUID().toString())
    .build();
    JWKSet jwkSet = new JWKSet(rsaKey);
    return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
    }

    启动后,访问 /.well-known/openid-configuration,你会看到属于你自己的认证中心的配置信息。那一刻,真的会有一种“掌控一切”的成就感!👑

    第四章:JWT 解析与自定义 Converter——拒绝 SCOPE_ 前缀!

    回到 Resource Server。Spring Boot 默认解析 JWT 时,会把 Token 里的 scope 字段转换成权限,并且加上 SCOPE_ 前缀。比如 scope 是 read,权限就是 SCOPE_read。

    但我们做国内项目,通常习惯用 ROLE_admin 或者直接用权限码 user:list。怎么改?这就需要 JwtAuthenticationConverter。

    1. Token 结构假设

    假设你的 JWT Payload 是这样的:

    {
    "sub": "user123",
    "authorities": ["ROLE_ADMIN", "sys:user:add"]
    }

    2. 自定义转换器代码

    我们需要告诉 Spring:别看 scope 了,去看 authorities 字段,而且别乱加前缀!

    @Bean
    public JwtAuthenticationConverter jwtAuthenticationConverter() {
    JwtGrantedAuthoritiesConverter grantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
    // 设置要去哪个字段找权限
    grantedAuthoritiesConverter.setAuthoritiesClaimName("authorities");
    // 设置前缀,这里设为空字符串,原样读取
    grantedAuthoritiesConverter.setAuthorityPrefix("");

    JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
    jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(grantedAuthoritiesConverter);
    return jwtAuthenticationConverter;
    }

    3. 应用到 SecurityFilterChain

    http.oauth2ResourceServer(oauth2 -> oauth2
    .jwt(jwt -> jwt.jwtAuthenticationConverter(jwtAuthenticationConverter()))
    );

    这样配置之后,你在 Controller 上的注解就可以写得很舒服:

    @PreAuthorize("hasAuthority('ROLE_ADMIN')") // 完美匹配
    @GetMapping("/admin")
    public String adminData() { ... }

    这才是我们熟悉的 Spring Security 嘛!灵活、强大、不设限。

    结语:安全不是终点,是起点

    洋洋洒洒聊了这么多,其实 OAuth 2.0 和 OIDC 在 Spring Boot 3 里的玩法远不止这些。比如 Token 的吊销(Revocation)、自省(Introspection)、BFF 模式(Backend for Frontend)等等。

    但我想传达给兄弟们的核心思想是:别害怕变化。Spring Security 6 虽然带来了巨大的 Breaking Changes,但它让我们的代码更安全、更符合现代标准。2026 年了,别再抱着旧文档啃了,用上这套组合拳,你会发现,原来构建一个银行级安全的系统,并没有想象中那么难。

    赶紧去升级你的依赖吧!如果有踩坑的,欢迎在评论区咱们Battle一下,我这里随时备着满汉全席(Bug复现代码)等着大家!😉 加油,全栈人!

    🧧福利赠与你🧧

      无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。

    最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

    同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G PDF编程电子书、简历模板、技术文章Markdown文档等海量资料。

    ps:本文涉及所有源代码,均已上传至Gitee开源,供同学们一对一参考 Gitee传送门,同时,原创开源不易,欢迎给个star🌟,想体验下被🌟的感jio,非常感谢❗

    🫵 Who am I?

    我是 bug菌:

    • 热活跃于 CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等技术社区;
    • CSDN 博客之星 Top30、华为云多年度十佳博主&卓越贡献奖、掘金多年度人气作者 Top40;
    • 掘金、InfoQ、51CTO 等平台签约及优质作者;
    • 全网粉丝累计 30w+。

    更多高质量技术内容及成长资料,可查看这个合集入口 👉 点击查看 👈️ 硬核技术公众号 「猿圈奇妙屋」 期待你的加入,一起进阶、一起打怪升级。

    – End –

    赞(0)
    未经允许不得转载:171主机测评 » 【SpringBoot 3.x 第60节】都 2026 年了,你还在手撸 OAuth2?Spring Boot 3 + OIDC 这一套打法,让安全不再是玄学!
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址