无需依赖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,具体步骤如下:
- 用
@ConfigurationProperties绑定自定义audience属性
创建配置属性类,绑定auth0.audience:
@ConfigurationProperties(prefix = "auth0") @Data public class Auth0Properties { private String audience; }
在主启动类或配置类上添加@EnableConfigurationProperties(Auth0Properties.class),启用该配置属性。
- 实现
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); }; }
- 移除手动创建的
JwtDecoderBean
删掉原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
相关产品推荐
相关产品推荐

