web-dev-qa-db-ja.com

スプリングブートでのフィルター次数

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;
}
33
igo

春の男たちがまた助けてくれました。 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;
}
40
igo

これは、Spring Boot 1.2で修正されました。セキュリティチェーンはデフォルトでorder _0

プロパティを介して設定することもできます:

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

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

16
Mikhail