2014-09-21 95 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