小编典典

通过WebFlux的证书认证?

spring-boot

在常规的Servlet
APISpring Boot网络,还有就是.x509()对的HttpSecurity配置。但是在WebFlux中,ServerHttpSecurity找不到类似的东西。

.x509().subjectPrincipalRegex(...)WebFlux中的等效项是什么

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


阅读 619

收藏
2020-05-30

共1个答案

小编典典

我认为没有像Spring的早期版本中那样有X509过滤器,因此您必须实现自己的版本。幸运的是,org.springframework.security.web.server.authentication.AuthenticationWebFilter该工具为身份验证流程提供了模式,但是您必须自己从证书/请求中提取主题。

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

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

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

2020-05-30