2015-02-10 2 views
19

Ich habe einen Frühling Stiefel WebMVC Anwendung und eine Bohne, die von AbstractPreAuthenticatedProcessingFilter erbt, die ich ausdrücklich auf eine bestimmte Stelle Zugabe bin in der Spring Security Filterkette. My Spring Security-Konfiguration sieht wie folgt aus:Prevent Frühlings-Boot von der Registrierung eines Servlet-Filter

<http pattern="/rest/**"> 
    <intercept-url pattern="/**" access="ROLE_USER"/> 
    <http-basic/> 
    <custom-filter after="BASIC_AUTH_FILTER" ref="preAuthenticationFilter"/> 
</http> 

<beans:bean id="preAuthenticationFilter" class="a.b.PreAuthenticationFilter"> 
    <beans:property name="authenticationManager" ref="customAuthenticationManager"/> 
</beans:bean> 

Die Sicherheitskonfiguration arbeitet. Das Problem ist, weil die PreAuthenticationFilter Klasse erbt von AbstractPreAuthenticatedProcessingFilter, Frühling Stiefel behandelt sie als Allzweck-Servlet-Filter und ist es zum Servlet-Filterkette für alle Anforderungen hinzufügen. Ich möchte nicht, dass dieser Filter für alle Anfragen Teil der Filterkette ist. Ich möchte nur, dass es Teil der spezifischen Spring Security-Filterkette ist, die ich konfiguriert habe. Gibt es eine Möglichkeit Frühlings-Boot zu verhindern, dass automatisch die preAuthenticationFilter Bohne zum Filterkette hinzuzufügen?

Antwort

31

Standardmäßig erstellt Spring Boot im Anwendungskontext für jede Filter eine FilterRegistrationBean, für die eine FilterRegistrationBean nicht bereits vorhanden ist. Auf diese Weise können Sie die Kontrolle über den Registrierungsprozess nehmen, einschließlich der Registrierung zu deaktivieren, indem Sie Ihre eigene FilterRegistrationBean für die Filter erklärt. Für Ihre PreAuthenticationFilter die erforderliche Konfiguration würde wie folgt aussehen:

@Bean 
public FilterRegistrationBean registration(PreAuthenticationFilter filter) { 
    FilterRegistrationBean registration = new FilterRegistrationBean(filter); 
    registration.setEnabled(false); 
    return registration; 
} 

können Sie auch in this Spring Boot issue interessiert sein, die, wie die automatische Registrierung von Filter und Servlet Bohnen deaktivieren diskutiert.

+0

Filter auch nach registration.setEnabled (false) arbeiten; – Nandhu

+0

@Nandhu In diesem Fall würde ich empfehlen, eine Frage des eigenen mit einem [minimal, vollständig und nachprüfbar Beispiel] zu fragen (/ help/MCVE). –

5

Wenn Sie alle Filter auf einmal hier deregistrieren wollen ist mein Trick:

public class DefaultFiltersBeanFactoryPostProcessor implements BeanFactoryPostProcessor { 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory bf) 
      throws BeansException { 
     DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) bf; 

     Arrays.stream(beanFactory.getBeanNamesForType(javax.servlet.Filter.class)) 
       .forEach(name -> { 

        BeanDefinition definition = BeanDefinitionBuilder 
          .genericBeanDefinition(FilterRegistrationBean.class) 
          .setScope(BeanDefinition.SCOPE_SINGLETON) 
          .addConstructorArgReference(name) 
          .addConstructorArgValue(new ServletRegistrationBean[]{}) 
          .addPropertyValue("enabled", false) 
          .getBeanDefinition(); 

        beanFactory.registerBeanDefinition(name + "FilterRegistrationBean", 
          definition); 
       }); 
    } 
} 

Ein bisschen mehr über diese Technik - here.

Verwandte Themen