Frage Verhindern, dass Spring Boot einen Servlet-Filter registriert


Ich habe eine Spring Boot WebMVC-Anwendung und eine Bean, die von AbstractPreAuthenticatedProcessingFilter erbt, die ich explizit zu einer bestimmten Stelle in der Spring Security-Filterkette hinzufüge. Meine Spring Security-Konfiguration sieht folgendermaßen aus:

<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 funktioniert. Das Problem besteht darin, dass die PreAuthenticationFilter-Klasse von AbstractPreAuthenticatedProcessingFilter erbt, Spring Boot sie als Servlet-Filter für allgemeine Zwecke behandelt und sie der Servlet-Filterkette für alle Anforderungen hinzufügt. 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, zu verhindern, dass Spring Boot automatisch die preAuthenticationFilter-Bean zur Filterkette hinzufügt?


21
2018-02-10 00:18


Ursprung


Antworten:


Standardmäßig erstellt Spring Boot a FilterRegistrationBean für jeden Filter in dem Anwendungskontext, für den a FilterRegistrationBean existiert nicht schon. Dies ermöglicht Ihnen, die Kontrolle über den Registrierungsprozess zu übernehmen, einschließlich der Deaktivierung der Registrierung, indem Sie Ihre eigenen deklarieren FilterRegistrationBean für die Filter. Für dein 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;
}

Das könnte Sie auch interessieren dieses Spring Boot Problem welches diskutiert, wie man die automatische Registrierung von deaktiviert Filter und Servlet Bohnen.


36
2018-02-10 09:28



Wenn du alle Filter auf einmal aufheben willst, hier 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 - Hier.


5
2017-11-28 02:45