2014-09-21 14 views
21

Come posso specificare l'ordine del mio filtro in spring-boot? Devo inserire il mio filtro MDC dopo il filtro Spring Security. Ho provato quasi tutto ma il mio filtro è sempre stato il primo. Questo non ha funzionato:Ordine del filtro in spring-boot

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

questo non ha funzionato troppo:

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

'@Order (Ordered.LOWEST_PRECEDENCE + 100)' non funzionerà perché 'Ordered.LOWEST_PRECEDENCE = Integer.Max' e intero. Max + 100 = un numero negativo, questo significherebbe una precedenza molto alta – Ralph

+0

@Ralph - Ho anche provato l'evento '@Order (Ordered.LOWEST_PRECEDENCE)' senza successo. – igo

+0

Quale versione di Spring Boot? Hai provato 1.1.7? –

risposta

21

Ragazzi da Spring aiutato di nuovo. Vedere https://github.com/spring-projects/spring-boot/issues/1640 e https://jira.spring.io/browse/SEC-2730

Primavera di sicurezza non imposta un ordine sul chicco di filtro che crea . Ciò significa che, quando Boot sta creando un FilterRegistrationBean per esso, ottiene l'ordine predefinito che è LOWEST_PRECEDENCE.

Se si desidera utilizzare il proprio filtro dopo Spring Security, è possibile creare la propria registrazione per il filtro Spring Security e specificare l'ordine.

Quindi la risposta alla mia domanda è:

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

Vedere anche la discussione in https://github.com/spring-projects/spring-boot/issues/677 e https://github.com/spring-projects/spring-boot/issues/1640 –

+2

Sicuramente LOWEST_PRECEDENCE significa * tutto * lo insegue ... – OrangeDog

+1

Grazie per la conferma. I suoi suoni così poco intuitivi, la precedenza più bassa significa che è il primo filtro incontrato dalla richiesta. – LearnToLive

8

Questo è stato fissato nella primavera del Boot 1.2. La catena di sicurezza ora ha come valore predefinito 0.

può anche essere impostato tramite le proprietà:

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

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

+2

In Spring Boot 1.3.x è 'SecurityProperties.DEFAULT_FILTER_ORDER' ed è' FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER \t - 100' o semplicemente '-100'. – gavenkoa

Problemi correlati