spring - WebFilter bean 在安全的 Spring Boot Webflux 应用程序中调用了两次

标签 spring spring-boot spring-security spring-webflux

我正在使用带有 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 中的过滤器执行顺序:
  • ServerWebExchangeReactorContextWebFilter
  • HttpHeaderWriterWebFilter
  • CorsWebFilter
  • ReactorContextWebFilter
  • AuthenticationWebFilter
  • SecurityContextServerWebExchangeWebFilter
  • ServerRequestCacheWebFilter
  • 注销WebFilter
  • 异常翻译WebFilter
  • 授权WebFilter
  • 测试网关过滤器
  • 关于spring - WebFilter bean 在安全的 Spring Boot Webflux 应用程序中调用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57391646/

    相关文章:

    java - Spring 安全 : requires-channel ="https" causes redirect loop

    java - spring web应用程序-html按钮-表单外的post方法-404错误

    java - Spring 5 样板项目无法运行

    java - Camel REST DSL swagger 输出包含无效的 responseSchema 元素

    javascript - CORS 干扰 Spring Security oauth2

    java - spring 3子bean验证

    java - SoapFaultMappingExceptionResolver 永远不会遇到常规 Java 异常

    java - 在 Spring Data Neo4j 中查询关系

    spring - 多个WebSecurityConfigurerAdapter : one as a library,中其他用户可以添加自己的安全访问权限

    spring - Grails 3-无插件的安全性