2014-09-21 7 views
21

스프링 부트에서 내 필터의 순서를 어떻게 지정할 수 있습니까? 스프링 보안 필터 후에 MDC 필터를 삽입해야합니다. 거의 모든 것을 시도했지만 필터가 항상 처음이었습니다. 이 작동하지 않았다 :스프링 부트의 필터 순서

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

'@Order (Ordered.LOWEST_PRECEDENCE + 100)''작동하지 Ordered.LOWEST_PRECEDENCE = Integer.Max' 정수 때문이다. Max + 100 = 약간의 음수. 이것은 매우 높은 우선 순위를 의미합니다. – Ralph

+0

@Ralph - 성공하지 못한 이벤트'@Order (Ordered.LOWEST_PRECEDENCE) '도 시도했습니다. – igo

+0

스프링 부트의 버전은 무엇입니까? 1.1.7을 시도 했습니까? –

답변

21

얘들 아 다시 도왔다. https://github.com/spring-projects/spring-boot/issues/1640https://jira.spring.io/browse/SEC-2730

봄 보안이 가 작성하는 필터 콩에 주문을 설정하지 않습니다를 참조하십시오. 즉, Boot가 FilterRegistrationBean을 만들 때 LOWEST_PRECEDENCE 인 기본 순서를 얻습니다.

스프링 보안을 수행하기 위해 자신 만의 필터를 사용하려면 스프링 보안 필터에 대한 사용자 고유의 등록을 만들고 을 지정할 수 있습니다.

그래서 내 질문에 대한 답은 다음과 같습니다

@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

https://github.com/spring-projects/spring-boot/issues/677 및 https://github.com/spring-projects에서 토론을 참조하십시오./spring-boot/issues/1640 –

+2

분명히 LOWEST_PRECEDENCE는 * 모든 것이 * 뒤 따르는 것을 의미합니다 ... – OrangeDog

+1

확인해 주셔서 감사합니다. 소리가 너무 직관적이지 않고 우선 순위가 가장 낮다는 것은 요청에 의해 처음으로 발생하는 필터를 의미합니다. – LearnToLive

8

이 봄 부팅 1.2에서 수정되었습니다. 보안 체인의 기본값은 0입니다.

은 또한 속성을 통해 설정 될 수

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

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

+2

스프링 부트 1.3.x에서는'SecurityProperties.DEFAULT_FILTER_ORDER'이고'FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER \t-100' 또는 단순히'-100'입니다. – gavenkoa

관련 문제