Evite que Spring Boot registre un filtro de servlet

Tengo una aplicación Spring Boot WebMVC y un bean heredado de AbstractPreAuthenticatedProcessingFilter, que estoy agregando explícitamente a un lugar específico en la cadena de filtros de Spring Security. La configuración de My Spring Security tiene este aspecto:

        

La configuración de seguridad funciona. El problema es que, debido a que la clase PreAuthenticationFilter hereda de AbstractPreAuthenticatedProcessingFilter, Spring Boot lo trata como un filtro de servlet de propósito general y lo agrega a la cadena de filtros de servlet para todas las solicitudes. No quiero que este filtro sea parte de la cadena de filtros para todas las solicitudes. Solo quiero que sea parte de la cadena de filtros Spring Security específica que he configurado. ¿Hay alguna manera de evitar que Spring Boot agregue automáticamente el bean preAuthenticationFilter a la cadena de filtros?

De forma predeterminada, Spring Boot crea un FilterRegistrationBean para cada Filter en el contexto de la aplicación para el que FilterRegistrationBean aún no existe. Esto le permite tomar el control del proceso de registro, incluido el deshabilitar el registro, al declarar su propio FilterRegistrationBean para el Filter . Para su PreAuthenticationFilter la configuración requerida se vería así:

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

Es posible que también le interese este problema de Spring Boot, que trata sobre cómo deshabilitar el registro automático de los beans Filter y Servlet .

Si quieres cancelar el registro de todos los filtros al mismo tiempo, aquí está mi truco:

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

Un poco más sobre esta técnica – aquí .