2014-09-21 16 views
21

Wie kann ich die Reihenfolge meines Filters im Spring-Boot angeben? Ich muss meinen MDC-Filter nach Spring Security-Filter einfügen. Ich habe fast alles ausprobiert, aber mein Filter war immer zuerst. Dies hat nicht funktioniert:Filterbestellung im Spring-Boot

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

Das ist nicht arbeiten:

@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)' wird nicht funktionieren, weil 'Ordered.LOWEST_PRECEDENCE = Integer.Max' und Integer:

Es kann auch über Eigenschaften eingestellt werden. Max + 100 = irgendeine negative Zahl, dies würde eine sehr hohe Priorität bedeuten – Ralph

+0

@Ralph - Ich habe auch das Ereignis '@Order (Ordered.LOWEST_PRECEDENCE)' ohne Erfolg versucht. – igo

+0

Welche Version von Spring Boot? Hast du 1.1.7 versucht? –

Antwort

21

Jungs ab Frühjahr wieder geholfen. Siehe https://github.com/spring-projects/spring-boot/issues/1640 und https://jira.spring.io/browse/SEC-2730

Spring Security einen Auftrag nicht auf dem Filter Bean ist gesetzt, dass es schafft. Das bedeutet, wenn Boot einen FilterRegistrationBean dafür erstellt, erhält er die Standardreihenfolge LOWEST_PRECEDENCE.

Wenn Sie möchten, dass Ihr eigener Filter nach Spring Security geht, können Sie Ihre eigene Registrierung für Spring Security Filter erstellen und die Bestellung angeben.

Also die Antwort auf meine Frage ist:

@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

Siehe auch Diskussion in https://github.com/spring-projects/spring-boot/issues/677 und https://github.com/spring-projects/Spring-Boot/Probleme/1640 –

+2

Sicher LOWEST_PRECEDENCE bedeutet * alles * geht nach ... – OrangeDog

+1

Danke für die Bestätigung. Das klingt so unintuitiv, die niedrigste Präzedenz bedeutet, dass dies der erste Filter ist, auf den die Anfrage trifft. – LearnToLive

8

Diese im Frühjahr Boot-1.2 behoben wurde. Die Sicherheitskette lautet jetzt standardmäßig 0.

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

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

+2

In Spring Boot 1.3.x ist es 'SecurityProperties.DEFAULT_FILTER_ORDER' und ist' FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER \t - 100' oder einfach '-100'. – gavenkoa