当前位置: 首页 > news >正文

Spring Boot 3.0 如何配置基于 JWT 的无状态 API 鉴权流程?

Spring Boot 3.0 项目中配置 JWT 无状态鉴权,核心是适应 Spring Security 6 的架构变化,使用 SecurityFilterChain Bean 替代已废弃的适配器类,并推荐优先使用 oauth2-resource-server starter 来简化校验逻辑。这适合前后端分离、需要无会话状态的 RESTful 接口场景。

先说结论:配置关键在于依赖升级和 Security 配置类重构,不再继承旧版适配器。

  • 适合:前后端分离的 RESTful 项目
  • 先看:Java 版本是否满足 17 及以上
  • 建议:优先使用官方 Resource Server 支持而非手写过滤器
  • 注意:密钥配置需区分对称与非对称场景

1. 环境与依赖检查

Spring Boot 3.0 强制要求 Java 17 或更高版本。在 pom.xml 中确认 compiler 版本设置,并引入以下核心依赖:

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

2. 配置 application.yml

在配置文件中指定 JWT 校验规则。本地开发常用对称密钥(HS256),生产环境建议对接认证中心的 JWK Set URI。

对称密钥配置示例:

spring:security:oauth2:resourceserver:jwt:# 对称密钥,建议使用 Base64 编码字符串,长度需满足算法要求(如 HS256 至少 32 字符)secret-key: your-very-long-secret-key-base64-encoded# 或者指定算法(通常自动识别,必要时显式指定)# jws-algorithm: HS256

非对称密钥配置示例:

spring:security:oauth2:resourceserver:jwt:# 指向认证服务器的公钥集合地址jwk-set-uri: https://auth-server.com/.well-known/jwks.json

3. 编写 SecurityFilterChain 配置

创建配置类,定义 SecurityFilterChain Bean。注意 Spring Boot 3 已全面迁移至 Jakarta EE,导入包名需为 jakarta.servlet 开头。同时需显式配置 CORS 和关闭 CSRF 以适配无状态 API。

package com.example.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import java.util.Arrays;
import java.util.List;@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// 关闭 CSRF,因为是无状态 API.csrf(csrf -> csrf.disable())// 配置会话管理为无状态.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))// 配置 CORS.cors(cors -> cors.configurationSource(corsConfigurationSource()))// 授权请求.authorizeHttpRequests(auth -> auth.requestMatchers("/api/public/**").permitAll() // 公开接口.anyRequest().authenticated() // 其他接口需认证)// 启用 OAuth2 Resource Server 支持 JWT.oauth2ResourceServer(oauth2 -> oauth2.jwt(jwt -> jwt.decoder(// 如果使用默认配置,Spring 会自动读取 yml 中的 secret-key 或 jwk-set-uri// 如需自定义解码器可在此注入,通常默认即可org.springframework.security.oauth2.jwt.JwtDecoders.fromIssuerLocation("http://localhost:8080") // 注意:上面这行仅示例,实际使用默认配置时可直接写 .jwt(Customizer.withDefaults()))));// 简化写法(推荐):直接利用 yml 配置/*.oauth2ResourceServer(oauth2 -> oauth2.jwt(org.springframework.security.config.Customizer.withDefaults()));*/return http.build();}@Beanpublic CorsConfigurationSource corsConfigurationSource() {return request -> {CorsConfiguration configuration = new CorsConfiguration();configuration.setAllowedOrigins(List.of("http://localhost:3000")); // 允许的前端域名configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));configuration.setAllowedHeaders(List.of("*"));configuration.setAllowCredentials(true);return configuration;};}
}

4. 接口验证命令

启动项目后,使用 curl 命令验证鉴权流程是否生效。

步骤 1:访问受保护接口(不带 Token)

预期返回 401 Unauthorized。

curl -v http://localhost:8080/api/user/profile

步骤 2:访问受保护接口(带 Token)

先生成一个有效的 JWT Token(本地测试可使用 jwt.io 生成,密钥需与 yml 中配置一致)。预期返回 200 OK 及业务数据。

curl -v -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." http://localhost:8080/api/user/profile

5. 常见坑与排查

  • 包名错误:代码中引用了 javax.servletjavax.annotation,编译会报错,需全部替换为 jakarta 开头。
  • 配置类遗留:旧项目中继承 WebSecurityConfigurerAdapter 的类必须删除或重构,否则应用无法启动。
  • CORS 拦截:无状态鉴权常跨域,需在 SecurityFilterChain 中显式配置 corsConfigurer,否则浏览器可能拦截请求导致前端拿不到 401 而是网络错误。
  • 密钥格式:对称密钥 secret-key 建议使用 Base64 编码,且长度需满足 JWT 算法安全要求(HS256 建议至少 256 位)。
  • Token 来源:Resource Server 只负责校验,不负责生成。测试时需确保 Token 是由可信的认证服务签发,或本地测试时手动生成符合配置的 Token。

原文链接:https://www.zjcp.cc/ask/11363.html

http://www.jsqmd.com/news/835299/

相关文章:

  • 38.太原报考CPPM与SCMP,职场进阶优选众智商学院 - 众智商学院课程中心
  • 2026石家庄工业机器人培训学校横评 师资力量 实训设备 就业保障 - 元点智创
  • 南充市场精神堡垒|2026年5月(上、中、下旬)工厂定制及政策|华蔓广告设计制作指导价 - 四川华蔓广告有限公司
  • 2026毕业季|避开论文AI率雷区必备保姆级指南! - 降AI实验室
  • 一文带你了解API 接口测试 | 了解 API 接口测试 | API 接口测试文档
  • 数据迁移工具从原生部署到 Docker,我踩了哪些坑
  • 天津:报考中质协六西格玛黑带和绿带指定报考机构推荐 - 众智商学院课程中心
  • 南充市场亚克力字|2026年5月(上、中、下旬)工厂定制及政策|华蔓广告设计制作指导价 - 四川华蔓广告有限公司
  • 2026年苏州离婚官司律所评测:专业能力与实战表现对比 - 奔跑123
  • 2026年苏州婚姻家事纠纷律所口碑排行:实测服务能力对比分析 - 奔跑123
  • 国内红色民俗藏品回收行业科普|正规机构大盘点,变现不再踩坑 - 品牌排行榜单
  • 南充市场公告栏|2026年5月(上、中、下旬)工厂定制及政策|华蔓广告设计制作指导价 - 四川华蔓广告有限公司
  • 在合肥招人,招员工有哪些合肥招聘平台有效、靠谱! - drfdxr
  • 【Web安全】Kali Linux基础:终端操作、文件管理与VIM编辑器实战指南
  • 南充市场喷绘写真|2026年5月(上、中、下旬)工厂定制及政策|华蔓广告设计制作指导价 - 四川华蔓广告有限公司
  • 2026 年全国标书代写靠谱公司推荐榜 | 附安华招标真实客户中标反馈 - 安华招标
  • 如何在 K8s Ingress 中配置全局 API Key 鉴权中间件?
  • 2026年石家庄PLC编程培训机构推荐榜 重实训强就业 - 元点智创
  • 南充市场穿孔字|2026年5月(上、中、下旬)工厂定制及政策|华蔓广告设计制作指导价 - 四川华蔓广告有限公司
  • 2026年3月苏州个人IP策划拍摄领域优选企业,可靠的个人IP策划拍摄 - 品牌推荐师
  • 南充市场平板UV喷印|2026年5月(上、中、下旬)工厂定制及政策|华蔓广告设计制作指导价 - 四川华蔓广告有限公司
  • 南充市场烤漆字|2026年5月(上、中、下旬)工厂定制及政策|华蔓广告设计制作指导价 - 四川华蔓广告有限公司
  • 数据库备份终极方案:开源数据库备份新选择,自动化、多平台、安全可靠
  • 解答抖音保存的视频水印怎样抹掉实用去除攻略 - 爱上科技热点
  • 2026年|全网最全的10款降ai率工具大盘点(持续更新) - 降AI实验室
  • 南充市场花草牌|2026年5月(上、中、下旬)工厂定制及政策|华蔓广告设计制作指导价 - 四川华蔓广告有限公司
  • 2026年AIGC去AI痕迹工具:提升学术论文原创性的必备神器 - 降AI实验室
  • 南充市场水晶字|2026年5月(上、中、下旬)工厂定制及政策|华蔓广告设计制作指导价 - 四川华蔓广告有限公司
  • 情景记忆作为身份认证因子:基于多感官事件编码的认知安全模型
  • 2026年10款国内外主流降AI率工具大汇总(最新免费版可用) - 降AI实验室