2015-02-10 62 views
19

我有一个春天启动WebMVC应用,以及从AbstractPreAuthenticatedProcessingFilter对此我明确地将在春季安全过滤器链的特定点继承的bean。我的Spring Security配置如下所示:防止弹簧引导从注册一个Servlet过滤器

<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> 

安全配置有效。问题是,因为PreAuthenticationFilter类从AbstractPreAuthenticatedProcessingFilter继承,春季启动将其视为一个通用Servlet过滤器,是将它添加到Servlet过滤器链的所有请求。我不希望此过滤器成为所有请求的过滤器链的一部分。我只希望它成为我配置的特定Spring Security筛选器链的一部分。有没有办法阻止Spring Boot自动将preAuthenticationFilter bean添加到过滤器链中?

回答

31

默认情况下,Spring Boot会在FilterRegistrationBean尚不存在的应用程序上下文中为每个Filter创建一个FilterRegistrationBean。这允许您通过声明您自己的FilterRegistrationBeanFilter来控制注册过程,包括禁用注册。为了您的PreAuthenticationFilter所需要的配置是这样的:

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

您还可能有兴趣在this Spring Boot issue其中讨论如何禁用的FilterServlet豆自动注册。

+0

过滤器后也registration.setEnabled(假)工作; – Nandhu 2018-01-02 09:30:11

+0

@Nandhu在这种情况下,我建议用一个[最小,完整,可验证的例子](/ help/mcve)来问你自己的问题。 – 2018-01-03 17:32:37

5

如果你想在同一时间注销所有过滤器,这里是我的绝招:更

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); 
       }); 
    } 
} 

一些关于这种技术 - here