register - spring boot servlet
Evite que Spring Boot registre un filtro de servlet (2)
De forma predeterminada, Spring Boot crea un
FilterRegistrationBean
para cada
Filter
en el contexto de la aplicación para el que todavía no existe un
FilterRegistrationBean
.
Esto le permite tomar el control del proceso de registro, incluida la desactivación del registro, declarando 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;
}
También puede estar interesado en
este tema de Spring Boot
que trata sobre cómo deshabilitar el registro automático de beans de
Filter
y
Servlet
.
Tengo una aplicación Spring Boot WebMVC y un bean que hereda de AbstractPreAuthenticatedProcessingFilter que estoy agregando explícitamente a un lugar específico en la cadena de filtros de Spring Security. Mi configuración de Spring Security se ve así:
<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>
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 específica de Spring Security que he configurado. ¿Hay alguna manera de evitar que Spring Boot agregue automáticamente el bean preAuthenticationFilter a la cadena de filtro?
Si quieres anular el registro de todos los filtros a la vez, 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, here .