복붙노트

[SPRING] Spring Security의 기본 필터 스택에서 하나의 필터를 삭제하는 방법?

SPRING

Spring Security의 기본 필터 스택에서 하나의 필터를 삭제하는 방법?

스프링 보안 스택에서 하나의 기본 필터를 제외해야합니다. 따라서 모든 필터는 평소대로 작동해야합니다. 그것은 그렇게 할 수있는 방법을 찾은 것 같아요, 사용자 정의 FilterChainProxy 만들기 :

public class CustomFilterChainProxy extends FilterChainProxy {

Logger LOGGER = Logger.getLogger(CustomFilterChainProxy.class);

public CustomFilterChainProxy() {
    super();
    LOGGER.debug("Run custom filter proxy");
    LOGGER.debug("String filters: " + this.toString());
}

public CustomFilterChainProxy(SecurityFilterChain chain) {
    super(chain);
    LOGGER.debug("Run custom filter proxy with chains");
}
}

보시다시피 필터 목록을 가져 오는 생성자가 있으므로 필요에 따라 체인에서 필터 하나를 삭제할 수 있으며 나머지는 평소와 같이 작동합니다. 그러나 나는 그러한 생성자에 대한 보안 설정에서 bean을 만들 수 없다. 내가 사용하면

<bean id="filterChainProxy" class="com.pkg.CustomFilterChainProxy">

물론 기본 생성자로 객체를 빌드하십시오. Ok, 일부 필터 목록으로 빈을 만들려고합니다.

<bean id="filterChainProxy" class="ru.olekstra.backoffice.util.CustomFilterChainProxy">
<constructor-arg>
    <list>
        <sec:filter-chain pattern="/**" 
        filters="BasicUserApprovalFilter" />
    </list>
</constructor-arg>
</bean>

하지만이 컴파일, 원인 BasicUserApprovalFilter 알 수없는 콩입니다. 그렇다면 기본 필터 스택에서 하나의 필터를 어떻게 제외시킬 수 있습니까? 사용자 정의 필터 체인 프록시 내 방식으로 좋은 결정, 그래서 기본 필터 체인과 콩을 만드는 방법은?

해결법

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

    1.필터를 제거하려는 이유와 그 이유에 대한 세부 정보가 있으면 도움이 될 것입니다.

    필터를 제거하려는 이유와 그 이유에 대한 세부 정보가 있으면 도움이 될 것입니다.

    원하는 경우 BeanPostProcessor를 사용하여 필터 체인을 만든 후에 수정할 수 있습니다. 기본 네임 스페이스 구성에서 요소로 만든 필터 체인에 이름을 지정할 수 있습니다.

    <http name="myFilterChain">
       ...
    

    이 이름으로 SecurityFilterChain 유형의 bean을 등록합니다. FilterChainProxy는이 목록에서 생성됩니다.

    후 처리기는 다음과 같습니다.

    public class SecurityFilterChainPostProcessor implements BeanPostProcessor {
    
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    
            if (beanName.equals("myFilterChain")) {
                DefaultSecurityFilterChain fc = (DefaultSecurityFilterChain)bean;
                List<Filter> filters = fc.getFilters();
    
                // Modify the filter list as you choose here.                
                List<Filter> newFilters = ...
    
                return new DefaultSecurityFilterChain(fc.getRequestMatcher(), newFilters);
            }
    
            return bean;
        }
    
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    }
    

    그런 다음이 빈의 인스턴스를 애플리케이션 컨텍스트에 등록하면 Spring이 나머지 작업을 수행한다. 그렇게하면 모든 스프링 보안 인프라 필터를 별도의 빈으로 정의하지 않아도됩니다.

    다음은 실제 예제 및 해당 구성에 대한 링크입니다.

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

    2.Spring Security config에서 filter-chain-map 태그를 통해 자신 만의 필터 체인을 정의 할 수 있습니다.

    Spring Security config에서 filter-chain-map 태그를 통해 자신 만의 필터 체인을 정의 할 수 있습니다.

    <bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
        <security:filter-chain-map>
           <sec:filter-chain pattern="/**"
                filters="
            ConcurrentSessionFilterAdmin, 
            securityContextPersistenceFilter, 
            logoutFilterAdmin, 
            .....
            anonymousAuthenticationFilter, 
            sessionManagementFilterAdmin, 
            exceptionTranslationFilter, 
            filterSecurityInterceptorAdmin,
            MonitoringFilter"/> 
        </security:filter-chain-map>
    </bean>
    
  3. from https://stackoverflow.com/questions/14237715/how-to-delete-one-filter-from-default-filter-stack-in-spring-security by cc-by-sa and MIT license