WebFlux的证书认证?

在Spring Boot Web的常规Servlet API中,有HttpSecurity配置的.x509() 。 但是在WebFlux的ServerHttpSecurity我找不到类似的东西。

.x509().subjectPrincipalRegex(...)等效的.x509().subjectPrincipalRegex(...)

最终目标是将证书主题作为发送到ReactiveUserDetailsService的用户名获取。

我认为没有像之前版本的spring那样的X509filter,所以你必须实现自己的版本。 幸运的是,方便的org.springframework.security.web.server.authentication.AuthenticationWebFilter提供了身份validation流程的模式,但您必须自己从证书/请求中提取主题。

您要做的第一件事是设置身份validation转换器以从证书中提取主题。

 public class X509AuthenticationConverter implements Function> { @Override public Mono apply(ServerWebExchange exchange) { ServerHttpRequest request = exchange.getRequest(); try { // extract credentials here Authentication authentication = ... return Mono.just(authentication); } catch (Exception e) { // log error here return Mono.empty(); } } } 

现在在我们的配置中,我们创建filter和转换器bean并将转换器设置为filter。

 @Bean public X509AuthenticationConverter x509AuthenticationConverter() { return new X509AuthenticationConverter(); } @Bean public AuthenticationWebFilter x509AuthenticationWebFilter(ReactiveAuthenticationManager reactiveAuthenticationManager, X509AuthenticationConverter x509AuthenticationConverter) { AuthenticationWebFilter authenticationWebFilter = new AuthenticationWebFilter(reactiveAuthenticationManager); authenticationWebFilter.setAuthenticationConverter(x509AuthenticationConverter); return authenticationWebFilter; } 

最后配置安全性

 @Bean SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http, AuthenticationWebFilter x509AuthenticationWebFilter) { return http .addFilterAt(x509AuthenticationWebFilter, SecurityWebFiltersOrder.AUTHENTICATION) //... .build(); } 

这与其他身份validation机制一样有效。