Spring Security 5.x OAuth2如何替换JSESSIONID使用Token完成身份认证
结论
大部分场景仅通过调整配置即可实现需求,仅少数自定义Token解析场景需要编写少量扩展代码。
问题根因
你当前的Spring Security配置默认启用了基于Session的认证上下文持久化逻辑,没有加载OAuth2 Bearer Token的解析处理链,因此只有携带JSESSIONID时才能从Session中恢复SecurityContext,请求携带Bearer Token时没有对应处理器解析并填充认证上下文。
具体实现步骤
1. 引入必要依赖
如果你的服务作为OAuth2资源服务器对外提供接口,首先引入对应依赖:
- Spring Boot项目引入起步依赖:
spring-boot-starter-oauth2-resource-server - 纯Spring项目引入:
spring-security-oauth2-resource-server+spring-security-oauth2-jose
2. 调整Security核心配置
修改SecurityFilterChain配置,开启Bearer Token解析,同时关闭Session生成与使用:
import org.springframework.security.config.http.SessionCreationPolicy; import static org.springframework.security.config.Customizer.withDefaults; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 前后端分离Token认证场景无需CSRF防护 .csrf(csrf -> csrf.disable()) // 配置Session策略为无状态,完全不生成、不使用JSESSIONID .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS) ) // 开启OAuth2资源服务器配置,默认启用JWT格式Token解析 .oauth2ResourceServer(oauth2 -> oauth2.jwt(withDefaults())) // 原有接口权限规则配置保持不变即可 .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ); return http.build(); }
补充配置文件(以Spring Boot YAML为例),指定JWT签发方校验地址:
spring: security: oauth2: resourceserver: jwt: issuer-uri: 你的授权服务器签发地址(与JWT payload中iss字段一致)
需要编写自定义代码的场景
只有以下特殊场景需要补充少量扩展代码,无需修改核心流程:
- 你使用的是不透明Token(Opaque Token)而非JWT,需要自定义Token内省逻辑
- 需要自定义Token权限映射规则,需实现
JwtAuthenticationConverter接口注入到配置中 - 服务同时需要支持授权码模式前端跳转登录和接口Bearer Token认证,需要配置多条独立的
SecurityFilterChain分别处理两类请求
验证规则
配置完成后重启服务,请求时在请求头携带Authorization: Bearer {实际access_token值}即可正常填充SecurityContext,服务端不会再返回JSESSIONID Cookie。
内容的提问来源于stack exchange,提问作者Alexander Sels
相关产品推荐
相关产品推荐

