我正在使用带有 webflux 和安全性的 Spring Boot 2.1.x。我定义了一些 AuthenticationWebFilter
类型的 bean添加到 MatcherSecurityWebFilterChain
.问题在于,由于它们被定义为 bean,它们也被添加到过滤器链的末尾,因此它们被执行了两次。
对于 Servlet 应用程序,我们可以使用 FilterRegistrationBean
为了避免这种情况:
@Bean
fun someFilterRegistrationBean() {
val frb = FilterRegistrationBean(xxx)
frb.setEnabled(false)
return frb
}
响应式(Reactive)应用程序的等价物是什么?
最佳答案
就我而言,我必须执行存储在 TestGatewayFilter 中的自定义逻辑,以在 SecurityWebFilterChain 的末尾修改 ServerWebExchange 对象。如果我们创建一个 TestGatewayFilter 的 bean 并让 spring 处理它,我们会发现每个请求都会调用两次过滤器逻辑。
我进行了研究,但没有找到在 spring-webflux-security 中定义 FilterRegistrationBean 的方法,但在调试时发现了一种不同的方法。
作为一种解决方法,我创建了一个 SecurityWebFilterChain 的自定义 bean,并在链的末尾注入(inject)了过滤器。为了防止 spring 两次注入(inject)这个过滤器,我们删除了创建它的 bean 的逻辑。现在,每个请求都会调用一次过滤器逻辑。
public class TestGatewayFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
// To-Do logic
}
}
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.addFilterAfter(new TestGatewayFilter(), SecurityWebFiltersOrder.AUTHORIZATION)
.authorizeExchange()
.anyExchange().authenticated();
return http.build();
}
在这我使用了添加过滤器后 () 方法在要在链中执行的最后一个过滤器之后添加我的过滤器。ServerHttpSecurity 类提供了另外 2 种方法来在另一个过滤器之前或在链中的特定位置添加一个过滤器。它们采用 addFilterAfter() 方法采用的相同参数集,并且可以以类似的方式使用:
addFilterBefore()
addFilterAt()
在调试时,这是 SecurityWebFilterChain 中的过滤器执行顺序:关于spring - WebFilter bean 在安全的 Spring Boot Webflux 应用程序中调用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57391646/