java - Spring Security 做自动过滤注入(inject)吗?

标签 java spring spring-security

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

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

这是自定义过滤器代码:

@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,即使我没有将它添加到过滤器链中任何地方。如果我在没有任何 @Configuration@Bean 注释的情况下声明 CustomFilter,除非我明确告诉它,否则它不会被添加到过滤器链中SecurityConfiguration 类。

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

最佳答案

是的,Spring Boot 文档说明如下:要添加 Servlet、Filter 或 Servlet *Listener,请为其提供 @Bean 定义。 ( source )

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

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

关于java - Spring Security 做自动过滤注入(inject)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38820782/

相关文章:

java - 如何将枚举发送到方法?

java - HTTP 状态 500 - 处理 JSP 页面时发生异常

java - 处理 AWT 图形上下文的最佳方式是什么?

java - JPA 2.1、Hibernate 4.3、Spring 4.0 数据未保存到数据库

mysql - 将 Java Web 应用程序与 jboss、mysql 和 activemq 一起打包以进行部署

java - 使用 Spring 3.1.x 和 MockMvc 模拟/ Autowiring bean

java - Spring LDAP 安全性不断重置

java - Spring Boot 开启 @GlobalMethodSecurity 时出现异常

java - 数据库中Spring中的写锁实体

java - 获取 Java 运行时参数 --argumentName=argumentValue