복붙노트

[SPRING] Spring 부트가 서블릿 필터를 등록하지 못하게한다.

SPRING

Spring 부트가 서블릿 필터를 등록하지 못하게한다.

Spring Boot WebMVC 애플리케이션과 AbstractPreAuthenticatedProcessingFilter에서 상속받은 Bean을 가지고있다.이 Bean은 Spring Security 필터 체인의 특정 지점에 명시 적으로 추가되었다. My Spring Security 설정은 다음과 같다.

<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를 상속 받기 때문에 스프링 부트는 이것을 범용 서블릿 필터로 취급하고 모든 요청에 ​​대해 서블릿 필터 체인에 추가한다는 것입니다. 이 필터가 모든 요청에 ​​대해 필터 체인의 일부가되는 것을 원하지 않습니다. 필자가 설정 한 특정 스프링 보안 필터 체인의 일부일뿐입니다. Spring 부트가 preAuthenticationFilter 빈을 필터 체인에 자동으로 추가하는 것을 막을 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.기본적으로 Spring Boot는 FilterRegistrationBean이 이미 존재하지 않는 응용 프로그램 컨텍스트의 모든 Filter에 대해 FilterRegistrationBean을 만듭니다. 이렇게하면 필터에 대한 자체 FilterRegistrationBean을 선언하여 등록을 비활성화하는 것을 포함하여 등록 프로세스를 제어 할 수 있습니다. PreAuthenticationFilter의 경우 필요한 구성은 다음과 같습니다.

    기본적으로 Spring Boot는 FilterRegistrationBean이 이미 존재하지 않는 응용 프로그램 컨텍스트의 모든 Filter에 대해 FilterRegistrationBean을 만듭니다. 이렇게하면 필터에 대한 자체 FilterRegistrationBean을 선언하여 등록을 비활성화하는 것을 포함하여 등록 프로세스를 제어 할 수 있습니다. PreAuthenticationFilter의 경우 필요한 구성은 다음과 같습니다.

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

    Spring과 Servlet 빈의 자동 등록을 해제하는 방법을 설명하는 Spring Boot 문제에 대해서도 관심이있을 것이다.

  2. ==============================

    2.한 번에 모든 필터의 등록을 취소하려면 여기 내 트릭이 있습니다.

    한 번에 모든 필터의 등록을 취소하려면 여기 내 트릭이 있습니다.

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

    이 기술에 대한 자세한 내용은 여기 - 여기.

  3. from https://stackoverflow.com/questions/28421966/prevent-spring-boot-from-registering-a-servlet-filter by cc-by-sa and MIT license