You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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的会话)。通过上述配置:

  1. 用SessionCreationPolicy.STATELESS强制Spring Security不创建会话
  2. 启用oauth2ResourceServer而非传统的oauth2Login(会话式认证入口)
  3. 配合server.servlet.session.stateless: true禁用容器层的会话跟踪

可实现完全无状态的令牌认证,满足多实例部署场景需求。

内容的提问来源于stack exchange,提问作者sm0217

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:01:31