programing

Spring Boot에서 서블릿필터를 등록하지 않도록 합니다.

goodsources 2023. 3. 27. 21:12
반응형

Spring Boot에서 서블릿필터를 등록하지 않도록 합니다.

Spring Boot WebMVC 어플리케이션과 Abstract Pre에서 상속받은 빈을 가지고 있습니다.스프링 보안 필터 체인의 특정 지점에 명시적으로 추가하는 Authenticated Processing Filter.스프링 보안 설정은 다음과 같습니다.

<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 클래스가 AbstractPre에서 상속되기 때문입니다.Authenticated Processing Filter, Spring Boot에서는 범용 서블릿필터로 취급되어 모든 요구에 대해 서블릿필터 체인에 추가합니다.이 필터를 모든 요청에 대한 필터 체인에 포함시키지 마십시오.설정한 특정 Spring Security 필터 체인의 일부만 사용할 수 있습니다.Spring Boot에서 필터 체인에 preAuthenticationFilter bean이 자동으로 추가되지 않도록 하는 방법이 있습니까?

기본적으로는 Spring Boot은FilterRegistrationBean모든 것에 대해서Filter응용 프로그램 컨텍스트에서FilterRegistrationBean이미 존재하지 않습니다.이것에 의해, 자신의 등록 프로세스를 선언하는 것으로, 등록의 무효화를 포함한 등록 프로세스를 제어할 수 있습니다.FilterRegistrationBean를 위해Filter고객님의PreAuthenticationFilter필요한 설정은 다음과 같습니다.

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

또, 이 Spring Boot 의 문제에 대해서도 관심이 있을 가능성이 있습니다.이 문제에 대해서는, 다음의 자동 등록을 무효로 하는 방법에 대해 설명합니다.Filter그리고.Servlet콩류.

한 번에 모든 필터를 등록 취소하려면 다음과 같이 하십시오.

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

기술에 대해 좀 더 자세히 설명하겠습니다.

(i와 같이) 2개의 필터 등록을 디세블로 할 필요가 있는 경우는, bean 의 이름을 입력합니다(이러한 필터가 덮어쓰지 않도록 합니다).

@Bean(name = "filterRegistrationBean1")
public FilterRegistrationBean<YourFilter1> registration(YourFilter1 f1) {
    FilterRegistrationBean<YourFilter1> registration = new FilterRegistrationBean<>(f1);
    registration.setEnabled(false);
    return registration;
}

@Bean(name = "filterRegistrationBean2")
public FilterRegistrationBean<YourFilter2> registration(YourFilter2 f2) {
    FilterRegistrationBean<YourFilter2> registration = new FilterRegistrationBean<>(f2);
    registration.setEnabled(false);
    return registration;
}

나는 그것을 하기 위해 aop을 사용하고, 당신의 필터를 삽입하기 위해 주변 포인트 컷을 사용합니다, manully invode.
filterChain.doFilter(request, response)

@Aspect
@Component
public class AspectDemo {

    @Around(value = "com.xxx.pointcut01()")
    public void around01(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("[Aspect-around01] start");

        ServletRequest request = (ServletRequest)Arrays.asList(
                ((MethodInvocationProceedingJoinPoint) joinPoint).getArgs()
        ).get(0);

        ServletResponse response = (ServletResponse)Arrays.asList(
                ((MethodInvocationProceedingJoinPoint) joinPoint).getArgs()
        ).get(1);


        FilterChain filterChain = (FilterChain)Arrays.asList(
                ((MethodInvocationProceedingJoinPoint) joinPoint).getArgs()
        ).get(2);

        filterChain.doFilter(request, response);

        //do not execute origin doFilter() method
        //joinPoint.proceed();
        System.out.println("[Aspect-around01] end");

    }

}

언급URL : https://stackoverflow.com/questions/28421966/prevent-spring-boot-from-registering-a-servlet-filter

반응형