通过 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
在用于 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