【问题标题】:Does Spring Security do automatic filter Injection?Spring Security 做自动过滤器注入吗?
【发布时间】:2016-12-13 17:33:16
【问题描述】:

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

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

这是自定义过滤器代码:

@Component
public class CustomFilter extends GenericFilterBean {

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

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

@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();
    }
}

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

我的问题:这是预期的行为吗?如果是,为什么?在我看来,自动向过滤器链添加过滤器是危险的,因为没有更好的词——无论我在SecurityConfiguration 中指定了什么,每个请求都会通过过滤器。

【问题讨论】:

    标签: java spring spring-security


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      主要区别在于,当您添加像您提到的常规过滤器时,它会被添加到主 servlet 容器过滤器链中,而当您通过 HttpSecurity.addFilter(Filter) 添加过滤器时,它会被添加到安全性 FilterChainProxy 中。过滤器链代理基本上是它自己在Filter 实现中的过滤器链,它委托给代理内部的过滤器。所以您的过滤器不会干扰安全过滤器。 为了说明一点,它会是这样的:

      1. 自定义过滤器
      2. FilterChainProxy(SessionFilter、BasicAuthFilter 等)
      3. 其他自定义过滤器
      4. OtherFilterChainProxy(OAuth2Filter等)

      所以 servlet 容器看到 4 个过滤器。 2 个自定义过滤器和 2 个 Spring Security 配置。当它到达 FilterChainProxy 时,代理只是委托内部链内部的第一个过滤器,当且仅当您的配置允许该安全配置拦截请求 URL。

      【讨论】:

      • 有道理,感谢您的解释。你知道这是否/在哪里记录?我进行了一些搜索,但无法找到说明自定义过滤器 bean 将自动添加到主 servlet 过滤器链的来源。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2014-07-28
      • 2018-07-05
      • 1970-01-01
      • 2020-11-04
      • 2019-10-01
      • 2015-10-19
      相关资源
      最近更新 更多