¿Cómo puedo especificar el orden de mi Filtro en la primavera de inicio? Necesito insertar mi MDC filtro después de la Primavera de filtro de Seguridad. He intentado casi todo pero mi filtro era siempre el primero. Esto no funciona:

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

Esto no trabajar demasiado:

@Bean
public FilterRegistrationBean userInsertingMdcFilterRegistrationBean() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    UserInsertingMdcFilter userFilter = new UserInsertingMdcFilter();
    registrationBean.setFilter(userFilter);
    registrationBean.setOrder(Integer.MAX_VALUE);
    return registrationBean;
}
InformationsquelleAutor igo | 2014-09-21

2 Comentarios

  1. 40

    Chicos de la Primavera ayudó 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 de frijol que se
    crea. Esto significa que, cuando Arranque es la creación de un
    FilterRegistrationBean para ello, se obtiene el orden predeterminado que es
    LOWEST_PRECEDENCE.

    Si quieres que tu propio Filtro para ir después de la Primavera de la Seguridad puede
    crear su propio registro para la Primavera de de Seguridad del filtro y especificar
    el pedido.

    Así que 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;
    }
    • Véase también la discusión en github.com/spring-projects/spring-boot/issues/677 y github.com/spring-projects/spring-boot/issues/1640
    • Seguramente LOWEST_PRECEDENCE significa todo va después de…
    • Dado HIGHEST_PRECEDENCE = -2147483648 y LOWEST_PRECEDENCE = 2147483647 supongo menor precedencia iba a ir a la última? Todo ir antes de?
    • Se debe ir a la última. De JavaDoc de @Orden: valores más bajos tienen mayor prioridad. El valor predeterminado es Ordenado.LOWEST_PRECEDENCE, lo que indica la prioridad más baja (de perder a cualquier otro orden especificado por el valor).
    • Prioridad != prioridad
  2. 16

    Esto fue corregido en la Primavera de Arranque 1.2. La cadena de la seguridad, por defecto el fin de 0.

    También puede ser configurado a través de propiedades:

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

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

    • En La Primavera De Arranque 1.3.x es SecurityProperties.DEFAULT_FILTER_ORDER y es FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER - 100 o simplemente -100.
    • En La Primavera De Arranque 2.1.x => spring.security.filter.order=-100

Dejar respuesta

Please enter your comment!
Please enter your name here