【发布时间】:2016-12-13 17:33:16
【问题描述】:
我有一个使用 spring-security 核心 v4.1.1.RELEASE 的 spring-boot 应用程序 (spring-boot v1.3.3.RELEASE)。
似乎如果我通过扩展OncePerRequestFilter 或GenericFilterBean 来制作自定义过滤器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