2014-06-24 12 views
5

Ich habe einen benutzerdefinierten Spring Security Filter, der GenericFilterBean erweitert.Was bedeutet das Hinzufügen von @Component zum benutzerdefinierten Spring Security Filter?

Um automatische Abhängigkeit und Bean-Erstellung zu tun, habe ich eine @ Komponent Annotation hinzugefügt.

In meinem Security Config ich registriere auch die Filter wie:

@Autowired 
private RestAuthenticationFilter restAuthenticationFilter; 

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

Alles funktioniert gut, außer dass mein Filter genannt werden zweimal ... Es scheint Frühling Filter auch automatisch auf Standardfilter ergänzt.

Was sollte hier der beste Ansatz sein?

UPDATE

@ Dave ist es das, was Sie meinen? Es scheint zu funktionieren.

@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

Ja, das habe ich gemeint. –

+0

Danke für die Bestätigung. Es ist irgendwie unangenehm, den Filter explizit zu deaktivieren, indem man eine FilterRegistrationBean @bean deklariert. –

+0

Ich denke, idealerweise könnte eine Filterabsicht aus einer Marker-Annotation ('@ SecurityFilter'?) In Verbindung mit der' @ Component' abgeleitet werden - dh - benutze mich in der Sicherheitskette oder benutze mich in der Standardfilterkette . Ich stieß selbst auf ein ähnliches Problem, weil mein Filter keine Bean-Ressourcen brauchte. Ich habe es nicht als '@ Bean' registriert, sondern nur einen Sicherheitsfilter programmgesteuert. – hoserdude

Antwort

7

Sie müssen explizit den Filter registrieren und markieren als "enabled = false" die FilterRegistrationBean API. Dann wird Spring Security es in seiner Kette verwenden, aber Boot wird nicht versuchen, es auch zu registrieren.

+0

Danke Dave, ich versuche die Antwort zu verstehen ... Was du im Grunde sagst ist, dass Spring Boot automatisch den Filter hinzufügt, und dass ich es als aktiviert registrieren sollte = false, um dieses Verhalten zu deaktivieren? Ich habe FilterRegistrationBean apidocs angeschaut, verstehe aber nicht, wie man enabled = false verwendet. Haben Sie vielleicht ein paar Hinweise oder ein Beispiel? –

+0

Ich habe gerade die RegistrationBean.setEnabled bemerkt, ich werde das versuchen. –

+0

Dave, sehe meine aktualisierte Frage mit Code, wie ich es gelöst habe. Ist das der Ansatz, den du meintest? Nebenbei, wäre es nicht einfacher, mit application.property die automatische Registrierung von Servlets und Filtern zu deaktivieren? In den meisten Fällen fügen Sie keine benutzerdefinierten Servlets hinzu. hauptsächlich die Spring Dispatcher Servlet- und Sicherheitsfilter. –