web-dev-qa-db-fra.com

Ordre des filtres dans Spring-Boot

Comment puis-je spécifier l'ordre de mon filtre dans Spring-Boot? Je dois insérer mon filtre MDC après le filtre Spring Security. J'ai essayé presque tout mais mon filtre était toujours le premier. Cela n'a pas fonctionné:

@Bean
@Order(Ordered.LOWEST_PRECEDENCE)
public UserInsertingMdcFilter userInsertingMdcFilter() {
    return new UserInsertingMdcFilter();
}

Cela n'a pas fonctionné aussi:

@Bean
public FilterRegistrationBean userInsertingMdcFilterRegistrationBean() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    UserInsertingMdcFilter userFilter = new UserInsertingMdcFilter();
    registrationBean.setFilter(userFilter);
    registrationBean.setOrder(Integer.MAX_VALUE);
    return registrationBean;
}
33
igo

Les gars de Spring ont encore aidé. Voir https://github.com/spring-projects/spring-boot/issues/164 et https://jira.spring.io/browse/SEC-27

Spring Security ne définit pas d'ordre sur le bean Filter qu'il crée. Cela signifie que, lorsque Boot crée un FilterRegistrationBean pour lui, il obtient l'ordre par défaut qui est LOWEST_PRECEDENCE.

Si vous souhaitez que votre propre filtre passe après Spring Security, vous pouvez créer votre propre enregistrement pour le filtre de Spring Security et spécifier la commande.

La réponse à ma question est donc:

@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

Cela a été corrigé dans Spring Boot 1.2. Par défaut, la chaîne de sécurité commande 0.

Il peut également être défini via les propriétés:

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

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

16
Mikhail