在引导中的spring安全过滤器链之前调用过滤器

Dee*_*mar 8 spring-boot

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

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

Zer*_*leb 9

application.properties

security.filter-order=5
Run Code Online (Sandbox Code Playgroud)

我自己没有这样做,但看看它出现的代码你只需要为安全过滤器的顺序设置属性.例如,在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

  • 谢谢,请注意 Spring Boot 2.1.3 中的属性是: spring.security.filter.order=5 (5认同)

spa*_*doo 7

我发现在 SpringBoot 2.0 中执行此操作的最佳方法是在 Spring Security 配置中使用 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')");
    }
}
Run Code Online (Sandbox Code Playgroud)


bil*_*eid 6

如果您不想在application.properties文件中为安全过滤器链选择任意顺序,则可以使用SecurityProperties.DEFAULT_FILTER_ORDER值设置顺序。这是安全过滤器链使用的值,因为它没有显式设置顺序值。

@Bean
public FilterRegistrationBean<MyFilter> myFilterRegistration() {
    FilterRegistrationBean<MyFilter> regBean= new FilterRegistrationBean<>();
    regBean.setFilter(new MyFilter());
    regBean.addUrlPatterns("/*");
    // Invoke MyFilter before the security filter chain
    regBean.setOrder(SecurityProperties.DEFAULT_FILTER_ORDER - 1);

    return regBean;
}
Run Code Online (Sandbox Code Playgroud)