0

我如何摆脱WebFilter与SecurityContextHolder中的块。我尝试在Mono的doOnSuccess(...)和ThenEmpty(...)中进行auth设置,但它从未被调用过。异步弹簧安全WebFilter

@Override 
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { 
    HttpHeaders headers = exchange.getRequest().getHeaders(); 
    long internalId = Long.parseLong(headers.get(INTERNAL_ID_HEADER).get(0)); 
    String email = headers.get(EMAIL_HEADER).get(0); 

    Mono<User> userMono = Mono.just(internalId) 
      .flatMap(userRepository::findById) 
      .switchIfEmpty(userRepository.save(new User().setId(internalId) 
          .setFirstName(getFirstName(email)) 
          .setLastName(getLastName(email)) 
          .setEmail(email) 
        ) 
      ); 

    SecurityContextHolder.getContext().setAuthentication(userMono.block()); 

    return chain.filter(exchange); 
} 

回答

0

看来你试图使用Spring Security的阻塞基础设施。 如果我没记错的话,SecurityContextHolderThreadLocal -based;该方法在无法在一个线程上处理给定请求的被动环境中不起作用。你可能想看看upcoming WebFlux support in Spring Security

+0

所以,你可以,请给我一个方法,我如何使用UserDetailsRepository的用户没有密码? (应用程序放置在Web服务器后面,该服务器使用SSO并设置所需的标题) –

+0

您是否试过我列出的博客文章中解释的方法? (使用EnableWebFluxSecurity并提供你的'UserDetailsRepository''完成后,请打开一个新的SO问题并显示你已经尝试了什么 –

+0

如何使用'UserDetailsRepository'给没有密码的用户授权使用标题值? –