如何通过Spring Security切换至Azure AD令牌认证并校验JWT访问令牌
从Spring Security会话认证切换到Azure AD令牌认证(无状态)
一、最简依赖配置
直接使用Spring官方OAuth2资源服务器starter,无需额外复杂依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency>
二、核心配置(application.yml)
配置Azure AD租户信息、客户端ID,同时明确启用无状态模式:
spring: security: oauth2: resourceserver: jwt: issuer-uri: https://login.microsoftonline.com/你的租户ID/v2.0 jwk-set-uri: ${spring.security.oauth2.resourceserver.jwt.issuer-uri}/discovery/v2.0/keys server: servlet: session: stateless: true # 配合Security配置彻底禁用会话跟踪
注:租户ID可从Azure AD门户“概述”页面获取;客户端ID是你在Azure AD中注册的应用程序ID。
三、Spring Security无状态配置类
编写配置类,强制禁用会话、启用JWT资源服务器认证:
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.config.http.SessionCreationPolicy; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 强制Spring Security不创建任何会话 .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 启用JWT资源服务器模式,自动处理令牌校验 .oauth2ResourceServer(oauth2 -> oauth2.jwt(jwt -> {})) // 根据业务需求配置权限规则,示例为所有请求需认证 .authorizeHttpRequests(auth -> auth.anyRequest().authenticated()); return http.build(); } }
四、JWT令牌自动校验逻辑
Spring Security的oauth2ResourceServer.jwt模块会自动完成以下校验动作:
- 从Azure AD的JWKS端点(配置的
jwk-set-uri)获取公钥 - 校验JWT签名的有效性
- 验证令牌的
iss(签发者)、aud(受众)、exp(过期时间)等标准声明 - 解析令牌中的用户信息(如
sub、name)并注入Spring Security的Authentication对象
关于session-stateless无效的问题说明
之前配置session-stateless无效果,核心原因是未明确启用资源服务器模式,仍在使用Azure AD默认的会话式认证(基于Authorization Code Flow的会话)。通过上述配置:
- 用
SessionCreationPolicy.STATELESS强制Spring Security不创建会话 - 启用
oauth2ResourceServer而非传统的oauth2Login(会话式认证入口) - 配合
server.servlet.session.stateless: true禁用容器层的会话跟踪
可实现完全无状态的令牌认证,满足多实例部署场景需求。
内容的提问来源于stack exchange,提问作者sm0217
相关产品推荐
相关产品推荐

