2012-08-03 69 views
1

如何添加標準的HTTP過濾器的多個自定義實現一個Spring Security的命名空間的FilterChainProxy?我知道我可以使用after,before或者position屬性添加一個過濾器到鏈中。但是,我怎樣才能添加多個過濾器?這是我的安全配置文件添加多個過濾器SpringSecurity命名空間FilterChain

<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"/> 

我想給portalSessionFilter和requestUrlStackFilter添加到上面的過濾器鏈。我有可能做到這一點

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

但我怎麼前的最後一次,並在之後portalSessionFilter BTW他們兩人都是簡單GenericFilterBean實現增加requestUrlStackFilter

我試圖在其鏈表上述兩個過濾器創建另一個的FilterChainProxy豆和之前的最後添加bean作爲一個自定義過濾器的命名空間配置和過濾器似乎工作,但我的JSF導航壞了,特別是與commandLink(我認爲AJAX調用使用這個FilterChainProxy會失敗時)

任何人都可以提出關於如何將這兩個過濾器和其他可能的篩選器添加到Spring Security的過濾器鏈的任何想法?

+0

正如在這[後](http://stackoverflow.com/questions/3931812/how-to-use-more-than-one-custom-filter-invoked-after-each-other)中提到的,我可以定位後<定製過濾器位置= 「LAST」 REF = 「過濾器3」/> <定製濾波器之前= 「LAST」 REF = 「過濾器2」/> <定製濾波器= 「SWITCH_USER_FILTER」 REF:只有最多3這樣=「filter1」/>,因爲SwitchUserFilter是標準順序中的最後一個。 – Ravi 2012-08-04 01:02:03

回答

2

我找到了我遇到的問題的解決方案。我通過實現我自己的過濾器鏈來解決它,而不是使用Spring安全篩選器鏈代理來鏈接我的過濾器。 FilterChainProxy的問題在於,它在過濾器鏈的末端使用重置方法,如果將其注入到主彈簧安全篩選器鏈代理之間,將導致問題。

自定義過濾器鏈只處理所需的過濾器和雙手向後控制主彈簧安全的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> 


這裏CustomFilterChain延伸GenericFilterBean之後但在的doFilter方法鏈過濾器(請求模式匹配)並最終將控制權交還給主彈簧安全FilterChainProxy