【问题标题】:Invoke a filter before spring security filter chain in boot在启动中的弹簧安全过滤器链之前调用过滤器
【发布时间】:2016-03-17 17:35:33
【问题描述】:

我已经如下配置了我的过滤器,但它没有在 Spring Security 过滤器链之前被调用。我已将订单设置为零

我正在使用 Spring Boot 1.3,它支持在过滤器上设置顺序

@Bean
public FilterRegistrationBean filterRegistrationBean() {

  FilterRegistrationBean registrationBean = new FilterRegistrationBean();

  registrationBean.setFilter(new UrlRewriteFilter());
  registrationBean.addUrlPatterns("*");
  registrationBean.addInitParameter("confReloadCheckInterval", "5");
  registrationBean.addInitParameter("logLevel", "DEBUG");
  registrationBean.addInitParameter("confPath", "urlrewrite.xml");
  registrationBean.setOrder(0);

  return registrationBean;
}

【问题讨论】:

    标签: spring-boot


    【解决方案1】:

    application.properties

    security.filter-order=5
    //>spring 2.1.3
    spring.security.filter-order=5
    

    这些属性会不时变化,可以在这里找到

    https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#actuator-properties

    我自己并没有这样做,但查看代码,您只需要为安全过滤器的顺序设置一个属性。例如在 application.properties 中

    这应该将您的过滤器排在安全过滤器之前。我不知道就安全性而言更改此顺序的含义是什么,这对我来说有点冒险。 Spring 开发人员在此处对此进行了讨论。最终他们实现了我上面的答案。

    讨论

    https://github.com/spring-projects/spring-boot/issues/1640

    测试显示此属性的作用。(搜索 testCustomFilterOrder())

    https://github.com/spring-projects/spring-boot/blob/1.2.x/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/SecurityAutoConfigurationTests.java

    【讨论】:

    • 感谢 Zergleb 提供解决方案。在 application.properties 中添加“security.filter-order=5”就可以了
    • 谢谢,请注意在 Spring Boot 2.1.3 中该属性为:spring.security.filter.order=5
    【解决方案2】:

    我发现在 SpringBoot 2.0 中执行此操作的最佳方法是在 Spring 安全配置中使用 addFilterBefore。我选择在用户名密码过滤器之前执行此操作,因为我的过滤器是替代登录过滤器

    @Configuration
    @EnableWebSecurity
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.addFilterBefore(new UrlRewriteFilter(), UsernamePasswordAuthenticationFilter.class)
                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS, "/*/**").permitAll()
                .antMatchers("/api/login").permitAll()
                .antMatchers("/api/**").access("hasRole('ROLE_ADMIN')");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-01-12
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 2017-03-18
      相关资源
      最近更新 更多