2014-09-21 18 views
21

Làm cách nào tôi có thể chỉ định thứ tự Bộ lọc của tôi trong khởi động mùa xuân? Tôi cần phải chèn bộ lọc MDC của tôi sau bộ lọc Spring Security. Tôi đã thử hầu hết mọi thứ nhưng bộ lọc của tôi luôn là đầu tiên. Điều này không làm việc:Thứ tự bộ lọc trong mùa xuân-boot

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

này đã không làm việc quá:

@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) 'sẽ không làm việc vì' Ordered.LOWEST_PRECEDENCE = Integer.Max' và Integer. Tối đa + 100 = một số số âm, điều này có nghĩa là ưu tiên rất cao – Ralph

+0

@Ralph - Tôi cũng đã thử sự kiện '@Order (Ordered.LOWEST_PRECEDENCE)' không thành công. – igo

+0

Phiên bản Spring Boot nào? Bạn đã thử 1.1.7 chưa? –

Trả lời

21

Guys từ mùa xuân giúp một lần nữa. Xem https://github.com/spring-projects/spring-boot/issues/1640https://jira.spring.io/browse/SEC-2730

Bảo mật mùa xuân không đặt hàng trên bean lọc mà tạo. Điều này có nghĩa là khi Khởi động tạo một FilterRegistrationBean cho nó, nó sẽ nhận được thứ tự mặc định là LOWEST_PRECEDENCE.

Nếu bạn muốn Bộ lọc của riêng bạn đi sau khi bảo mật của mùa xuân, bạn có thể tạo đăng ký riêng cho bộ lọc của Spring Security và chỉ định đơn đặt hàng.

Vì vậy, câu trả lời cho câu hỏi của tôi là:

@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

Xem thêm thảo luận trong https://github.com/spring-projects/spring-boot/issues/677 và https://github.com/spring-projects/spring-boot/issues/1640 –

+2

Chắc chắn LOWEST_PRECEDENCE có nghĩa là * mọi thứ * theo sau nó ... – OrangeDog

+1

Cảm ơn bạn đã xác nhận. Âm thanh của nó rất khó hiểu, ưu tiên thấp nhất có nghĩa là bộ lọc đầu tiên gặp phải bởi yêu cầu. – LearnToLive

8

này đã được cố định trong mùa xuân Boot 1.2. Chuỗi bảo mật hiện mặc định đặt hàng 0.

Nó cũng có thể được thiết lập thông qua thuộc tính:

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

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

+2

Trong Spring Boot 1.3.x, nó là 'SecurityProperties.DEFAULT_FILTER_ORDER' và là' FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER \t - 100' hoặc đơn giản là '-100'. – gavenkoa

Các vấn đề liên quan