Spring-bootでフィルターの順序を指定するにはどうすればよいですか? 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;
}
春の男たちがまた助けてくれました。 https://github.com/spring-projects/spring-boot/issues/164 および https://jira.spring.io/browse/SEC-27 を参照してください
Spring Securityは、作成するFilter Beanに順序を設定しません。これは、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;
}
これは、Spring Boot 1.2で修正されました。セキュリティチェーンはデフォルトでorder _0
。
プロパティを介して設定することもできます:
security.filter-order=0 # Security filter chain order.