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

无需依赖Issuer,如何在Spring OAuth中添加受众验证?

问题描述

当前使用的Spring Security OAuth2资源服务器配置代码如下:

@Configuration
@Slf4j
public class AuthConfig {
    @Value("${auth0.audience}")
    private String audience;

    @Getter
    @Value("${spring.security.oauth2.resourceserver.jwt.issuer-uri}")
    private String issuer;

    @Bean
    public SessionRegistry sessionRegistry() {
        return new SessionRegistryImpl();
    }

    @Bean
    public SecurityFilterChain filterChain(
            HttpSecurity http
    ) throws Exception {
        ....
    }

    @Bean
    JwtDecoder jwtDecoder() {
        NimbusJwtDecoder jwtDecoder = JwtDecoders.fromOidcIssuerLocation(issuer);

        OAuth2TokenValidator<Jwt> audienceValidator = new AudienceValidator(audience);
        OAuth2TokenValidator<Jwt> withIssuer = JwtValidators.createDefaultWithIssuer(issuer);
        OAuth2TokenValidator<Jwt> withAudience = new DelegatingOAuth2TokenValidator<>(withIssuer, audienceValidator);

        jwtDecoder.setJwtValidator(withAudience);

        return jwtDecoder;
    }

    private static class AudienceValidator implements OAuth2TokenValidator<Jwt> {
        private final String audience;

        public AudienceValidator(String audience) {
            this.audience = audience;
        }

        public OAuth2TokenValidatorResult validate(Jwt jwt) {
            OAuth2Error error = new OAuth2Error("invalid_token", "The required audience is missing", null);

            if (jwt.getAudience().contains(audience)) {
                return OAuth2TokenValidatorResult.success();
            }
            return OAuth2TokenValidatorResult.failure(error);
        }
    }
}

已配置Spring属性:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://jackiergleason.auth0.com/

疑问:配置上述属性后Spring会自动创建JwtDecoder Bean,不想手动从属性中获取issuer,希望仅用@ConfigurationProperties和自定义的audience属性,能否直接为Spring自动创建的JwtDecoder添加AudienceValidator?是否存在基础操作错误?

解决方案

可以通过**自定义JwtDecoderCustomizer**实现为Spring自动创建的JwtDecoder添加AudienceValidator,无需手动创建JwtDecoder Bean,具体步骤如下:

  1. 用@ConfigurationProperties绑定自定义audience属性
    创建配置属性类,绑定auth0.audience:
@ConfigurationProperties(prefix = "auth0")
@Data
public class Auth0Properties {
    private String audience;
}

在主启动类或配置类上添加@EnableConfigurationProperties(Auth0Properties.class),启用该配置属性。

  1. 实现JwtDecoderCustomizer添加验证器
    创建Bean实现JwtDecoderCustomizer接口,注入Auth0Properties和Spring自动创建的JwtIssuerValidator,组合验证器后设置到自动生成的JwtDecoder:
@Bean
public JwtDecoderCustomizer jwtDecoderCustomizer(Auth0Properties auth0Properties, JwtIssuerValidator issuerValidator) {
    return decoder -> {
        // 自定义Audience验证逻辑
        OAuth2TokenValidator<Jwt> audienceValidator = jwt -> {
            OAuth2Error error = new OAuth2Error("invalid_token", "The required audience is missing", null);
            if (jwt.getAudience().contains(auth0Properties.getAudience())) {
                return OAuth2TokenValidatorResult.success();
            }
            return OAuth2TokenValidatorResult.failure(error);
        };
        // 组合默认issuer验证器和自定义audience验证器
        OAuth2TokenValidator<Jwt> combinedValidator = new DelegatingOAuth2TokenValidator<>(issuerValidator, audienceValidator);
        // 为自动创建的JwtDecoder设置组合验证器
        ((NimbusJwtDecoder) decoder).setJwtValidator(combinedValidator);
    };
}
  1. 移除手动创建的JwtDecoder Bean
    删掉原AuthConfig中的jwtDecoder()方法,Spring会自动根据issuer-uri创建JwtDecoder,并通过上述JwtDecoderCustomizer完成自定义配置。

注意事项

  • 确保spring-security-oauth2-resource-server依赖版本在Spring Boot 2.4+或Spring Security 5.4+以上,JwtDecoderCustomizer是在这些版本中引入的。
  • 无需手动获取issuer,Spring自动创建的JwtIssuerValidator已经包含基于issuer-uri的验证逻辑,直接注入使用即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:15:58