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

Spring Authorization Server无法通过Bearer Token授权API端点请求

解决方案:单模块同时作为授权服务器+资源服务器的Bearer Token认证配置

核心问题

你的问题源于安全过滤器链的规则匹配与优先级冲突:Spring Authorization Server会自动处理默认OAuth2端点(如/userinfo)的Bearer Token认证,但自定义REST API被通用Web安全规则拦截,触发了跳转登录的会话式认证逻辑,而非无状态的Bearer Token认证。这种场景完全可行,只需通过拆分过滤器链解决。

具体操作步骤

1. 补充资源服务器依赖

除Spring Authorization Server依赖外,需引入Spring Security OAuth2资源服务器starter,用于处理Bearer Token验证:

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

2. 配置两个独立的SecurityFilterChain

通过@Order指定优先级,分别处理授权服务器端点和自定义API的认证逻辑,避免规则冲突。

授权服务器过滤器链(处理OAuth2授权流程端点)

@Configuration
public class AuthorizationServerSecurityConfig {

    @Bean
    @Order(1)
    public SecurityFilterChain authorizationServerFilterChain(HttpSecurity http) throws Exception {
        // 应用授权服务器默认安全配置
        OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
        // 启用OIDC(按需选择)
        http.getConfigurer(OAuth2AuthorizationServerConfigurer.class)
                .oidc(Customizer.withDefaults());

        // 授权流程的登录入口,保留表单登录
        http.exceptionHandling(exceptions -> exceptions
                .authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login"))
        );

        return http.build();
    }
}

资源服务器过滤器链(处理自定义REST API)

@Configuration
public class ResourceServerSecurityConfig {

    @Bean
    @Order(2)
    public SecurityFilterChain resourceServerFilterChain(HttpSecurity http) throws Exception {
        http
                // 精准匹配你的自定义API路径
                .securityMatcher("/api/**")
                .authorizeHttpRequests(auth -> auth
                        .anyRequest().authenticated()
                )
                // 启用Bearer Token(JWT格式)认证
                .oauth2ResourceServer(oauth2 -> oauth2
                        .jwt(Customizer.withDefaults())
                )
                // API采用无状态认证,禁用会话创建
                .sessionManagement(session -> session
                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                );

        return http.build();
    }
}

3. 配置JWT验证规则(针对JWT格式的访问Token)

如果授权服务器颁发的是JWT Token,需配置从授权服务器的JWKS端点获取公钥用于验证:

@Configuration
public class JwtValidationConfig {

    @Value("${spring.security.oauth2.resourceserver.jwt.jwk-set-uri}")
    private String jwkSetUri;

    @Bean
    public JwtDecoder jwtDecoder() {
        return NimbusJwtDecoder.withJwkSetUri(jwkSetUri).build();
    }
}

对应的application.yml配置:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: http://localhost:8080/oauth2/jwks # 替换为你的授权服务器JWKS端点

4. 验证测试

调用自定义API时,在请求头中携带Authorization: Bearer {你的访问Token},此时请求会直接通过JWT验证完成授权,不会被重定向到登录页。

关键注意事项

  • 过滤器链优先级:@Order数值越小优先级越高,授权服务器的过滤器链需优先匹配自身端点(如/oauth2/**、/login),资源服务器的过滤器链匹配自定义API路径
  • 路径匹配精准度:通过securityMatcher明确限定资源服务器的处理范围,避免与授权服务器端点冲突
  • 无状态会话:API服务必须设置SessionCreationPolicy.STATELESS,符合Bearer Token无状态认证的特性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:27:48