在spring-boot中过滤顺序

如何在spring-boot中指定filter的顺序? 我需要在Spring Securityfilter之后插入我的MDCfilter。 我几乎尝试了所有东西,但我的滤镜始终是第一个 这不起作用:

@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; } 

来自Spring的人再次帮助。 请参阅https://github.com/spring-projects/spring-boot/issues/1640和https://jira.spring.io/browse/SEC-2730

Spring Security不会在它创建的Filter bean上设置顺序。 这意味着,当Boot为其创建FilterRegistrationBean时,它将获得默认顺序LOWEST_PRECEDENCE。

如果您希望自己的Filter能够使用Spring Security,您可以为Spring Security的filter创建自己的注册并指定顺序。

所以我的问题的答案是:

 @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; } 

这在Spring Boot 1.2中得到修复。 安全链现在默认为0

它也可以通过属性设置:

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

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