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;
}
ベストアンサー1
Spring の皆さんがまた助けてくれました。以下をご覧ください:
- Spring Security のフィルター #1640 に倣ってフィルターの注文を簡単にする
- SEC-2730: WebSecurityConfiguration によって作成された springSecurityFilterChain に LOWEST_PRECEDENCE より高い順序を指定します #2955
前者から:
Spring Security
は、作成する Beanに順序を設定しませんFilter
。つまり、Boot が を作成するとFilterRegistrationBean
、デフォルトの順序である が取得されますLOWEST_PRECEDENCE
。独自の を
Filter
の後に表示したい場合は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;
}