2012-08-03 3 views
1

스프링 보안 네임 스페이스 FilterChainProxy에 표준 Http 필터의 여러 커스텀 구현을 어떻게 추가 할 수 있습니까? 나는 after, before 또는 position 속성을 사용하여 체인에 하나의 필터를 추가 할 수 있다는 것을 알고 있습니다. 그러나 어떻게 하나 이상의 필터를 추가 할 수 있습니까?. 여기 내 보안 설정 파일여러 개의 필터를 SpringSecurity 네임 스페이스에 추가하기 FilterChain

I 위의 필터 체인에 portalSessionFilter 및 requestUrlStackFilter을 추가 할
<http pattern="/javax.faces.resource/**" security="none"/> 
<http pattern="/resources/**" security="none"/> 
<http pattern="/session_list.jsp" security="none"/> 
<http pattern="/security/cas_logout.jsf" security="none"/> 
<http pattern="/user/account_signup.jsf" security="none"/> 
<http pattern="/user/company_user_association.jsf" security="none"/> 
<http pattern="/user/account_signup_review.jsf" security="none"/>      

<http auto-config="true" use-expressions="true" entry-point-ref="casEntryPoint" access-decision-manager-ref="accessDecisionManager">    
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')"/> 
    <logout logout-success-url="/security/cas_logout.jsf" invalidate-session="true"/> 
    <custom-filter position="CAS_FILTER" ref="casFilter"/> 
    <custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER"/> 
    <custom-filter ref="singleLogoutFilter" before="CAS_FILTER"/>  
</http> 

    <beans:bean id="portalSessionFilter" class="org.x.web.security.PortalSessionInterceptor"/>  
    <beans:bean id="requestUrlStackFilter" class="org.x.web.security.RequestUrlStackFilter"/> 

입니다. 나는 가능성이

<custom-filter ref="portalSessionFilter" before="LAST"/> 

할 수 그러나 어떻게 LAST 전에 오른쪽 BTW portalSessionFilter 둘 다 간단한 GenericFilterBean 구현 후 requestUrlStackFilter를 추가 않습니다.

위의 두 필터가 체인 목록에있는 FilterChainProxy 빈을 작성하고 해당 bean을 마지막 네임 스페이스 구성에 대한 사용자 정의 필터로 추가하여 필터가 작동하지만 내 JSF 탐색이 손상된 경우 commandLink를 사용하면 (이 FilterChainProxy를 사용할 때 AJAX 호출이 실패한 것 같습니다)

누구나이 두 필터와 가능한 다른 필터를 스프링 보안 필터 체인에 추가하는 방법에 대해 아이디어를 제안 할 수 있습니까?

+0

이 [post] (http://stackoverflow.com/questions/3931812/how-to-use-more-than-one-custom-filter-invoked-after-each-other)에서 언급했듯이, SwitchUserFilter가 표준 순서의 마지막 항목이기 때문입니다. – Ravi

답변

2

내가 가진 문제에 대한 해결책을 찾았습니다. 스프링 필터 필터 체인 프록시를 사용하여 내 필터를 연결하는 대신 자체 필터 체인을 구현하여 해결했습니다. FilterChainProxy의 문제는 주 스프링 보안 필터 체인 프록시 사이에 삽입 할 때 문제가되는 필터 체인 끝에 reset 메서드를 사용한다는 것입니다.

사용자 정의 필터 체인은 필요한 필터를 처리하고 주 스프링 보안 filterchainproxy로 컨트롤을 넘겨줍니다. 여기서의 설정은 변경

<http auto-config="false" use-expressions="true" entry-point-ref="casEntryPoint" access-decision-manager-ref="accessDecisionManager">   
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')"/> 
    <logout logout-success-url="/security/cas_logout.jsf" invalidate-session="true"/> 
    <custom-filter position="CAS_FILTER" ref="casFilter"/> 
    <custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER"/> 
    <custom-filter ref="singleLogoutFilter" before="CAS_FILTER"/> 
    <custom-filter ref="customFilterChain" before="LAST"/> 
</http> 

<beans:bean id="customFilterChain" class="org.x.web.security.CustomFilterChain"> 
<beans:constructor-arg> 
    <beans:list> 
     <filter-chain pattern="/javax.faces.resource/**" filters="none"/> 
     <filter-chain pattern="/resources/**" filters="none"/> 
     <filter-chain pattern="/**" filters="portalSessionFilter,requestUrlStackFilter"/> 
    </beans:list> 
</beans:constructor-arg> 

여기

CustomFilterChainGenericFilterBean 연장 후하지만 doFilter 방법 체인에 보이는 방법이다 (요청 패턴 매칭) 필터 마지막으로 컨트롤을 주 스프링 보안기에 전달합니다. FilterChainProxy

관련 문제