2014-09-21 112 views
21

如何在弹簧启动中指定我的过滤顺序?我需要在Spring Security过滤器之后插入我的MDC过滤器。我尝试了几乎所有的东西,但我的过滤器总是第一。这不起作用:弹簧启动中的过滤顺序

@Bean 
@Order(Ordered.LOWEST_PRECEDENCE) 
public UserInsertingMdcFilter userInsertingMdcFilter() { 
    return new UserInsertingMdcFilter(); 
} 

这并没有太多的工作:

从春天
@Bean 
public FilterRegistrationBean userInsertingMdcFilterRegistrationBean() { 
    FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 
    UserInsertingMdcFilter userFilter = new UserInsertingMdcFilter(); 
    registrationBean.setFilter(userFilter); 
    registrationBean.setOrder(Integer.MAX_VALUE); 
    return registrationBean; 
} 
+2

'@Order(Ordered.LOWEST_PRECEDENCE + 100)'不会工作,因为'Ordered.LOWEST_PRECEDENCE = Integer.Max'和整数。最大+ 100 =一些负数,这将意味着非常高的优先级 – Ralph 2014-09-21 09:57:22

+0

@Ralph - 我也尝试过事件'@订单(Ordered.LOWEST_PRECEDENCE)'没有成功。 – igo 2014-09-21 10:15:00

+0

什么版本的Spring Boot?你试过1.1.7吗? – 2014-10-01 10:28:32

回答

21

家伙再次帮助。见https://github.com/spring-projects/spring-boot/issues/1640https://jira.spring.io/browse/SEC-2730

Spring Security没有设置过滤豆,它 创建一个订单。这意味着,当Boot为它创建一个 FilterRegistrationBean时,它将获得默认顺序,即 LOWEST_PRECEDENCE。

如果你想让你自己的过滤器在Spring Security之后去,你可以 为Spring Security的过滤器创建你自己的注册并且指定 这个命令。

所以回答我的问题是:

@Bean 
public FilterRegistrationBean securityFilterChain(@Qualifier(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME) Filter securityFilter) { 
    FilterRegistrationBean registration = new FilterRegistrationBean(securityFilter); 
    registration.setOrder(Integer.MAX_VALUE - 1); 
    registration.setName(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME); 
    return registration; 
} 

@Bean 
public FilterRegistrationBean userInsertingMdcFilterRegistrationBean() { 
    FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 
    UserInsertingMdcFilter userFilter = new UserInsertingMdcFilter(); 
    registrationBean.setFilter(userFilter); 
    registrationBean.setOrder(Integer.MAX_VALUE); 
    return registrationBean; 
} 
+0

另请参阅https://github.com/spring-projects/spring-boot/issues/677和https://github.com/spring-projects中的讨论/ spring-boot/issues/1640 – 2015-06-20 07:41:44

+2

当然,LOWEST_PRECEDENCE意味着*所有内容都会在... – OrangeDog 2016-04-15 16:55:06

+1

感谢您的确认。它的声音非常不直观,最低优先级意味着这是请求遇到的第一个过滤器。 – LearnToLive 2017-03-07 22:14:40

8

这是在春季启动1.2固定。安全链现在默认为订购0

它也可以通过属性进行设置:

security.filter-order=0 # Security filter chain order. 

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

+2

在Spring Boot 1.3.x中它是'SecurityProperties.DEFAULT_FILTER_ORDER',并且是'FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER \t - 100'或者简单的'-100'。 – gavenkoa 2017-07-18 20:54:43