java - starter - Orden de filtro en resorte de arranque
spring mvc and spring boot (2)
Chicos de Spring ayudaron de nuevo. Ver https://github.com/spring-projects/spring-boot/issues/1640 y https://jira.spring.io/browse/SEC-2730
Spring Security no establece un orden en el filtro Bean que crea. Esto significa que, cuando Boot está creando un FilterRegistrationBean para él, obtiene el orden predeterminado que es LOWEST_PRECEDENCE.
Si desea que su propio filtro vaya después de Spring Security, puede crear su propio registro para el filtro de Spring Security y especificar el pedido.
Entonces la respuesta a mi pregunta es:
@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;
}
¿Cómo puedo especificar el orden de mi filtro en Spring-boot? Necesito insertar mi filtro MDC después del filtro Spring Security. Intenté casi todo, pero mi filtro siempre fue primero. Esto no funcionó:
@Bean
@Order(Ordered.LOWEST_PRECEDENCE)
public UserInsertingMdcFilter userInsertingMdcFilter() {
return new UserInsertingMdcFilter();
}
Esto tampoco funcionó:
@Bean
public FilterRegistrationBean userInsertingMdcFilterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
UserInsertingMdcFilter userFilter = new UserInsertingMdcFilter();
registrationBean.setFilter(userFilter);
registrationBean.setOrder(Integer.MAX_VALUE);
return registrationBean;
}
Esto se solucionó en Spring Boot 1.2. La cadena de seguridad ahora está por defecto en el orden 0
.
También se puede establecer a través de propiedades:
security.filter-order=0 # Security filter chain order.