2014-06-24 15 views
5

Tôi có bộ lọc Spring Security tùy chỉnh mở rộng GenericFilterBean.Ý nghĩa của việc thêm @Component vào bộ lọc Spring Security tùy chỉnh

Để làm phụ thuộc tự động và tạo bean, tôi đã thêm chú thích @Component.

Trong cấu hình an ninh của tôi, tôi cũng đăng ký bộ lọc như:

@Autowired 
private RestAuthenticationFilter restAuthenticationFilter; 

protected void configure(HttpSecurity http) throws Exception { 
    // @formatter:off 
    http 
     .addFilterBefore(restAuthenticationFilter, LogoutFilter.class) 

Tất cả mọi thứ hoạt động tốt, ngoại trừ bộ lọc của tôi được gọi là hai lần ... Dường như mùa xuân thêm bộ lọc cũng tự động đến các bộ lọc tiêu chuẩn.

Phương pháp tiếp cận tốt nhất ở đây là gì?

CẬP NHẬT

@ Dave này là những gì bạn nghĩa là gì? Dường như nó hoạt động.

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class Application extends WebMvcConfigurerAdapter { 

    @Autowired 
    private RestAuthenticationFilter restAuthenticationFilter; 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @Bean 
    public ApplicationSecurity applicationSecurity() { 
     return new ApplicationSecurity(); 
    } 

    @Bean 
    public FilterRegistrationBean filterRegistrationBean() { 
     FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); 
     filterRegistrationBean.setEnabled(false); 
     filterRegistrationBean.setFilter(restAuthenticationFilter); 
     return filterRegistrationBean; 
    } 

    @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
    protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter { 

     @Autowired 
     private RestAuthenticationFilter restAuthenticationFilter; 

     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      // @formatter:off 
      http 
       .addFilterBefore(restAuthenticationFilter, LogoutFilter.class) 
       .authorizeRequests() 
        .anyRequest().authenticated() 
        .and() 
       .csrf() 
        .disable() 
       .exceptionHandling() 
        .authenticationEntryPoint(new Http403ForbiddenEntryPoint()) 
        .and() 
       .requestCache() 
        .requestCache(new NullRequestCache()) 
        .and() 
       .sessionManagement() 
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS); 
      // @formatter:on 
     } 
    } 
} 
+0

Vâng, đó là ý của tôi. –

+0

Cảm ơn bạn đã xác nhận. Nó bằng cách nào đó cảm thấy khó chịu để vô hiệu hóa một cách rõ ràng bộ lọc bằng cách tuyên bố một FilterRegistrationBean @bean. –

+0

Tôi nghĩ lý tưởng là ý định của Bộ lọc có thể được suy ra từ chú thích đánh dấu ('@ SecurityFilter'?) Cùng với' @ Component' - tức là - sử dụng tôi trong chuỗi Security so với sử dụng tôi trong chuỗi bộ lọc tiêu chuẩn . Tôi đã gặp phải vấn đề tương tự, vì bộ lọc của tôi không cần bất kỳ tài nguyên Bean nào mà tôi không đăng ký nó như một '@ Bean', chỉ là một Bộ lọc bảo mật theo lập trình. – hoserdude

Trả lời

7

Bạn cần đăng ký bộ lọc một cách rõ ràng và đánh dấu bộ lọc là "enabled = false" bằng cách sử dụng API FilterRegistrationBean. Sau đó Spring Security sẽ sử dụng nó trong chuỗi của nó, nhưng Boot sẽ không thử và đăng ký nó.

+0

Cảm ơn Dave, tôi đang cố gắng để hiểu câu trả lời ... Những gì bạn đang nói về cơ bản là Spring Boot tự động thêm bộ lọc, và rằng tôi nên đăng ký nó như là enabled = false để vô hiệu hóa hành vi này? Tôi nhìn vào FilterRegistrationBean apidocs nhưng không hiểu làm thế nào để sử dụng enabled = false. Do yo có thể có một số con trỏ hoặc maube biết một số ví dụ? –

+0

Tôi chỉ nhận thấy RegistrationBean.setEnabled, tôi sẽ thử điều này. –

+0

Dave, xem câu hỏi được cập nhật của tôi với mã tôi đã giải quyết nó như thế nào. Đây có phải là cách tiếp cận bạn muốn nói không? Trên một lưu ý phụ, nó sẽ không dễ dàng hơn để có application.property để vô hiệu hóa tự động đăng ký servlets và bộ lọc? Trong hầu hết các trường hợp, bạn không thêm ny bất kỳ servlet tùy chỉnh nào; chủ yếu là servlet Spring Dispatcher và các bộ lọc bảo mật. –

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