【发布时间】:2021-10-25 03:39:12
【问题描述】:
我使用 spring security server config 保护了 spring boot 服务 A
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: https://sts.windows.net/****-azure-tenant-id-***/
client:
provider:
azure-ad:
issuer-uri: https://sts.windows.net/****-azure-tenant-id-***/
audience-id: ****-resource-id-****
安全配置
@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
public class WebSecurityConfiguration {
@Value("${audience-id}")
private String audience;
@Value("${spring.security.oauth2.client.provider.azure-ad.issuer-uri}")
private String issuer;
@Autowired
ReactiveJwtDecoder jwtDecoder;
@Bean
@Order(10)
public SecurityWebFilterChain oAuth2SecurityWebFilter(ServerHttpSecurity http) {
return http
.securityMatcher(new PathPatternParserServerWebExchangeMatcher("/**"))
.anyExchange().authenticated()
.and()
.oauth2ResourceServer()
.jwt()
.jwtDecoder(jwtDecoder)
.and()
.and()
.build();
}
@Bean
public ReactiveJwtDecoder reactiveJwtDecoder() {
OAuth2TokenValidator<Jwt> withIssuer = JwtValidators.createDefaultWithIssuer(issuer);
OAuth2TokenValidator<Jwt> withAudience = new DelegatingOAuth2TokenValidator<>(withIssuer, new AudienceValidator(audience));
NimbusReactiveJwtDecoder reactiveJwtDecoder = (NimbusReactiveJwtDecoder) ReactiveJwtDecoders.fromIssuerLocation(issuer);
reactiveJwtDecoder.setJwtValidator(withAudience);
return reactiveJwtDecoder;
}
}
所以这个应用程序是安全的,需要一个资源 id 为 ****-resource-id-**** 的不记名令牌来访问 api。
我有另一个服务 B 与此服务 A 进行通信并授予客户端凭据
spring:
security:
oauth2:
client:
provider:
azure-ad:
token-uri: https://login.microsoftonline.com/***-tenant-id-**/oauth2/token
registration:
azure-ad:
authorization-grant-type: client_credentials
client-id: ****-resource-id-****
client-secret: ****-client-seret-***
Web客户端配置
@Configuration
public class WebClientConfiguration {
@Bean
WebClient webClient(ReactiveClientRegistrationRepository clientRegistrationRepository) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrationRepository, new UnAuthenticatedServerOAuth2AuthorizedClientRepository());
oauth.setDefaultClientRegistrationId("azure-ad");
return WebClient.builder().filter(oauth).build();
}
}
当通过自动装配 webclient 调用从服务 B 到服务 A 时,webclient 正在发送一个不记名令牌,但该不记名不是服务 A 的资源 ID 并且失败并出现 403 禁止。 如何配置 webclient 为服务 A 的资源 id 请求令牌?
【问题讨论】:
-
您好@user09,我可以提供此实现的完整示例吗?实际上,我也在使用 azure AD 和 spring security 实现相同的功能,但没有找到任何完整的示例,例如我们是否需要在控制器或某处添加注释。那么您能否通过让我知道在哪里可以找到完整实施示例的链接来帮助我?
标签: spring spring-security oauth-2.0 azure-active-directory spring-security-oauth2