Подтвердить что ты не робот

Порядок фильтрации в spring -boot

Как я могу указать порядок моего фильтра в spring -boot? Мне нужно вставить мой MDC-фильтр после Spring фильтра безопасности. Я пробовал почти все, но мой фильтр всегда был первым. Это не помогло:

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

Ответ 1

Ребята из Spring снова помогли. См. https://github.com/spring-projects/spring-boot/issues/1640 и https://jira.spring.io/browse/SEC-2730

Spring Безопасность не устанавливает порядок в фильтре bean, чтобы он создает. Это означает, что, когда Boot создает FilterRegistrationBean для него, он получает порядок по умолчанию, который LOWEST_PRECEDENCE.

Если вы хотите, чтобы ваш собственный фильтр прошел после Spring Security, вы можете создайте свою собственную учетную запись для Spring фильтра безопасности и укажите порядок.

Итак, ответ на мой вопрос:

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

Ответ 2

Это было исправлено в Spring Boot 1.2. Теперь цепочка безопасности по умолчанию имеет порядок 0.

Он также может быть задан с помощью свойств:

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

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