Spring Security 是否进行自动过滤器注入?

Ste*_*ven 6 java spring spring-security

我有一个使用 spring-security 核心 v4.1.1.RELEASE 的 spring-boot 应用程序 (spring-boot v1.3.3.RELEASE)。

似乎如果我通过扩展OncePerRequestFilteror制作自定义过滤器 bean GenericFilterBean,我的过滤器将自动添加到过滤器链中,无论我是否调用addFilter()在自定义类中HttpSecurity传递给的对象。configure()WebSecurityConfigurerAdapter

这是自定义过滤器代码:

@Component
public class CustomFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        // custom filter code here
    }
}
Run Code Online (Sandbox Code Playgroud)

这是缩写的安全配置代码:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {

        // not adding the custom filter here

        http.authorizeRequests()
                .antMatchers("/api/login/**").permitAll()
                .anyRequest().authenticated();
    }
}
Run Code Online (Sandbox Code Playgroud)

我观察到的是,即使我没有将它添加到过滤器链的任何地方,所有请求,甚至是 to /api/login,都会通过CustomFilter。如果我声明CustomFilter没有任何@Configuration@Bean注释,它不会被添加到过滤器链中,除非我在SecurityConfiguration类中明确告诉它。

我的问题:这是预期的行为吗?如果是这样,为什么?在我看来,自动将过滤器添加到过滤器链是危险的,因为没有更好的词 - 无论我在SecurityConfiguration.

sho*_*ull 6

是的,Spring Boot 文档如下To add a Servlet, Filter, or Servlet *Listener provide a @Bean definition for it.:(来源

您可以使用以下方法手动禁用过滤器:

@Bean
public FilterRegistrationBean registration(@Qualifier("customFilter") Filter filter) {
    FilterRegistrationBean registration = new FilterRegistrationBean(filter);
    registration.setEnabled(false);
    return registration;
}
Run Code Online (Sandbox Code Playgroud)