Java ReactiveSecurityContextHolder#getContext返回一个空上下文

Java ReactiveSecurityContextHolder#getContext返回一个空上下文,java,spring,spring-security,spring-webflux,Java,Spring,Spring Security,Spring Webflux,我尝试对用户进行身份验证(它可以工作)并从上下文中获取用户令牌,但它不起作用 我有一个简单的微服务应用程序作为我的宠物项目,并使用WebFlux作为web框架。我试图调试ReactiveSecurityContextHolder#getContext和inside flatMap,我在上下文中看到了我的用户令牌,但在我的应用程序中,我的上下文是空的 SecurityConfiguration.java @EnableWebFluxSecurity 公共类安全配置{ @豆子 公共安全WebFilt

我尝试对用户进行身份验证(它可以工作)并从上下文中获取用户令牌,但它不起作用

我有一个简单的微服务应用程序作为我的宠物项目,并使用WebFlux作为web框架。我试图调试ReactiveSecurityContextHolder#getContext和inside flatMap,我在上下文中看到了我的用户令牌,但在我的应用程序中,我的上下文是空的

SecurityConfiguration.java

@EnableWebFluxSecurity
公共类安全配置{
@豆子
公共安全WebFilterChain安全WebFilterChain(
AuthenticationWebFilter AuthenticationWebFilter,
ServerHttpSecurity(http){
返回http
.csrf().disable()
.httpBasic().disable()
.formLogin().disable()
.logout().disable()
.addFilterAt(authenticationWebFilter、SecurityWebFiltersOrder.AUTHENTICATION)
.授权交易所()
.anyExchange().authenticated()
.及()
.build();
}
@豆子
公共身份验证WebFilter身份验证WebFilter(
SecurityTokenBasedAuthenticationManager身份验证管理器,
TokenAuthenticationConverter(TokenAuthenticationConverter){
AuthenticationWebFilter AuthenticationWebFilter=新建AuthenticationWebFilter(authenticationManager);
authenticationWebFilter.setServerAuthenticationConverter(tokenAuthenticationConverter);
authenticationWebFilter.setSecurityContextRepository(新的WebSessionServerSecurityContextRepository());
返回authenticationWebFilter;
}
}
ReactiveAuthenticationManager.java

@Slf4j
@组成部分
@AllArgsConstructor
公共类SecurityTokenBasedAuthenticationManager实现了反应式AuthenticationManager{
私人最终AuthWebClient AuthWebClient;
@凌驾
公共Mono身份验证(身份验证){
返回Mono.just(身份验证)
.switchIfEmpty(Mono.defer(this::raiseBadCredentials))
.cast(Authorization.class)
.flatMap(此::authenticateToken)
.map(用户->
新授权(用户,(AuthHeaders)authentication.getCredentials());
}
私有单raiseBadCredentials(){
返回Mono.error(新的TokenValidationException(“无效凭证”);
}
专用Mono authenticationToken(授权认证令牌){
AuthHeaders AuthHeaders=(AuthHeaders)authenticationToken.getCredentials();
返回可选的.of(authHeaders)
.map(headers->authWebClient.validateUserToken(authHeaders.getAuthToken(),authHeaders.getRequestId())
.doOnSuccess(用户->日志
.info(“经过身份验证的用户”+用户.getUsername()+”,设置安全上下文)
.orelsetrow(()->新丢失的HeaderException(“缺少授权”);
}
}
SecurityUtils.java

@Slf4j
公共类安全工具{
公共静态Mono getAuthHeaders(){
返回getSecurityContext()
.map(SecurityContext::getAuthentication)
.map(身份验证::getCredentials)
.cast(AuthHeaders.class)
.doOnSuccess(authHeaders->log.info(“Auth headers:{}”,authHeaders));
}
私有静态Mono getSecurityContext(){
返回ReactiveSecurityContextHolder.getContext();
}
}
网络客户大厦

(…)
WebClient.builder()
.baseUrl(url)
.过滤器(记录过滤器)
.defaultHeaders(httpHeaders->
getAuthHeaders()
.doOnNext(标题->httpHeaders.putAll(
地图(
请求ID,singletonList(headers.getRequestId()),
授权,singletonList(headers.getAuthToken()()()()))
.build()
(...)

主要的问题是在我的WebClient的一个构建中-我希望,我会有一个完整的WebClient和请求的头,但正如我前面所描述的-我在SecurityUtils.java中有一个空的上下文,因此,在调查和调试之后,我发现了一个将流合并为单个流的原因。嗯,这不是这个问题的原因,但现在它起作用了

(…)
getAuthHeaders()
.flatMap(authHeaders->buildWebClient(url,authHeaders)
.get()
(...)