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机制一样有效。