servlet register spring spring-security spring-boot

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 .