2014-06-24 3 views
5

Ho un filtro personalizzato Spring Security che estende GenericFilterBean.Che cosa implica l'aggiunta di @Component al filtro personalizzato Spring Security

Per eseguire la dipendenza automatica e la creazione di bean ho aggiunto un'annotazione @Component.

Nel mio config sicurezza ho registrerà anche il filtro come:

@Autowired 
private RestAuthenticationFilter restAuthenticationFilter; 

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

Tutto funziona bene, tranne che il mio filtro è chiamato due volte ... Sembra primavera aggiunge filtri automaticamente anche per filtri standard.

Quale dovrebbe essere l'approccio migliore qui?

UPDATE

@ Dave è questo che vuoi dire? Sembra funzionare.

@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

Sì, questo è ciò che intendevo. –

+0

Grazie per la conferma. In qualche modo si sente spiacevole disabilitare esplicitamente il filtro dichiarando FilterRegistrationBean @bean. –

+0

Penso che idealmente l'intento di Filter possa essere dedotto da un'annotazione marcatore ('@ SecurityFilter'?) In congiunzione con' @ Component' - cioè - usami nella catena Security vs. usami nella catena di filtri standard . Mi sono imbattuto in un problema simile me stesso, perché il mio filtro non aveva bisogno di risorse Bean. Non l'ho registrato come '@ Bean', solo un filtro di sicurezza a livello di programmazione. – hoserdude

risposta

7

È necessario registrare in modo esplicito il filtro e segnare come "enabled = false" utilizzando l'API FilterRegistrationBean. Quindi Spring Security lo utilizzerà nella sua catena, ma Boot non tenterà di registrarlo.

+0

Grazie Dave, sto cercando di capire la risposta ... Quello che stai dicendo in sostanza è che Spring Boot aggiunge automaticamente il filtro e che dovrei registrarlo come enabled = false per disabilitare questo comportamento? Ho esaminato gli apidoc FilterRegistrationBean ma non capisco come usare enabled = false. Forse hai qualche suggerimento o maube di conoscere qualche esempio? –

+0

Ho appena notato RegistrationBean.setEnabled, ci proverò. –

+0

Dave, guarda la mia domanda aggiornata con codice come ho risolto. È questo l'approccio che intendevi? In una nota a margine, non sarebbe più semplice avere application.property per disabilitare servlet e filtri di registrazione automatica? Nella maggior parte dei casi non si aggiungono ny servlet personalizzati; principalmente il servlet Spring Dispatcher e i filtri di sicurezza. –