通过 WebFlux 证书进行身份验证?

Authentication by certificate for WebFlux?

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

WebFlux

.x509().subjectPrincipalRegex(...)的等价物是什么

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

我认为 spring 的早期版本中没有 X509 过滤器,因此您必须实现自己的版本。幸运的是,方便的 org.springframework.security.web.server.authentication.AuthenticationWebFilter 提供了身份验证流程的模式,但您必须自己从 cert/request 中提取主题。

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

public class X509AuthenticationConverter implements Function<ServerWebExchange, Mono<Authentication>> {

    @Override
    public Mono<Authentication> 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();
        }
    }
}

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

@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();
}

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

我建议您将 spring 安全版本升级到 5.2.0 以上。有类似的 x509 身份验证支持可用。看下面link。 https://docs.spring.io/spring-security/site/docs/5.2.x/reference/html/reactive-x509.html