始终调用Spring自定义筛选器

Adi*_*lil 2 spring spring-mvc spring-security spring-boot

我有一个在BasicAuthenticationFilter之前调用的自定义过滤器,Bean在SecurityConfig文件中自动装配.

.addFilterBefore(preAuthTenantContextInitializerFilter, BasicAuthenticationFilter.class)
Run Code Online (Sandbox Code Playgroud)

以下是过滤器的外观.

@Component
public class PreAuthTenantContextInitializerFilter extends OncePerRequestFilter {
    @Autowired
    private TenantService tenantService;
.....
.....
Run Code Online (Sandbox Code Playgroud)

我希望这个过滤器不会像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/**");
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过了什么.

从过滤器类中删除@Component注释,它只会阻止过滤器在任何情况下调用,因为过滤器不再被选为bean并且永远不会进入过滤器链.

我在找什么

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

M. *_*num 9

任何Servlet,FilterServlet *Listener实例,它是一个Spring bean将与嵌入容器注册.如果要从application.properties配置期间引用值,这可能特别方便.

此代码段来自Spring Boot 参考指南.基本上Filter,在应用程序上下文中检测到的任何内容都将注册到默认过滤器链并映射到DispatcherServlet/.

在您的情况下,由于过滤器被标记为@Component将是一个bean,Spring Boot会检测到并将其注册到嵌入式容器中.但是,您不希望它只是您希望它成为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;
}
Run Code Online (Sandbox Code Playgroud)

使用这个添加的bean,Spring Boot不会在嵌入式容器中注册过滤器,因此它只会作为Spring Security过滤器链的一部分进行调用.