小编典典

总是调用Spring自定义过滤器

spring-boot

我有一个自定义过滤器,该过滤器在BasicAuthenticationFilter之前调用,该Bean是自动连接到SecurityConfig文件中的。

.addFilterBefore(preAuthTenantContextInitializerFilter, BasicAuthenticationFilter.class)

这是过滤器的外观。

@Component
public class PreAuthTenantContextInitializerFilter extends OncePerRequestFilter {
    @Autowired
    private TenantService tenantService;
.....
.....

我希望此过滤器不会像Spring
Security过滤器链的其余部分那样触发,该其余部分用于WebSecurityConfigurerAdapter#configure(WebSecurity
web)web.ignoring()中包含的路径。

这是它的样子

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources", 
                                    "/configuration/security", "/swagger-ui.html", 
                                    "/webjars/**","/swagger-resources/configuration/ui",
                                    "/swagge‌​r-ui.html", "/docs/**");
    }
}

我已经尝试过的。

从过滤器类中删除@Component批注,这只会阻止过滤器在任何情况下都无法调用,因为该过滤器不再被选作bean,并且永远不会进入过滤器链。

我在寻找什么

我希望在调用Spring Security链的其余部分时调用此过滤器,并像在其他Spring
Security过滤器中一样在web.ignoring()中忽略路径。谢谢。


阅读 360

收藏
2020-05-30

共1个答案

小编典典

任何ServletFilterServlet *Listener实例,它是一个Spring
bean将与嵌入容器注册。如果要application.properties在配置过程中引用一个值,这将特别方便。

该摘录来自Spring Boot 参考指南。基本上Filter,在应用程序上下文中检测到的所有内容都将注册到默认过滤器链中,并映射到DispatcherServlet/

在您的情况下,由于过滤器被标记为@Component它将是Bean,因此Spring
Boot会检测到is并将其注册到嵌入式容器中。但是,您不希望仅将其包含在Spring Security过滤器链中。

为此,您有2个选项。

  1. 删除@Component@Autowired并构造您自己的实例,不要使其成为bean。
  2. 添加一个额外的[ FilterRegistrationBean]并将enabled属性设置为false,这将阻止Spring Boot向嵌入式容器注册它。

Herer是选项2的解决方案:

@Bean
public FilterRegistrationBean preAuthTenantContextInitializerFilterRegistration(PreAuthTenantContextInitializerFilter filter) {
    FilterRegistrationBean registration = new FilterRegistrationBean(filter);
    registration.setEnabled(false);
    return registration;
}

有了这个添加的bean,Spring Boot将不会在嵌入式容器中注册过滤器,因此,它将仅作为Spring Security过滤器链的一部分被调用。

2020-05-30