将多个筛选器添加到SpringSecurity命名空间FilterChain

时间:2012-08-03 22:36:21

标签: jsf-2 spring-security

如何将标准Http Filter的多个自定义实现添加到Spring Security命名空间FilterChainProxy?我知道我可以使用after,before或position属性为链添加一个过滤器。但是,如何添加多个过滤器?这是我的安全配置文件

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

但是如何在LAST之前和 portalSessionFilter 之后添加 requestUrlStackFilter BTW两者都是简单的GenericFilterBean实现。

我尝试在其链列表中创建另一个 FilterChainProxy bean以及上面两个过滤器,并在LAST之前将该bean作为自定义过滤器添加到命名空间配置中,过滤器似乎可以工作但我的JSF导航是破坏的,尤其是使用commandLink(我认为使用此FilterChainProxy时AJAX调用失败)

有人可以就如何将这两个过滤器和可能的其他过滤器添加到Spring安全过滤器链中提出任何建议吗?

1 个答案:

答案 0 :(得分:2)

我找到了解决我遇到的问题的方法。我通过实现自己的过滤器链而不是使用spring安全过滤器链代理链接我的过滤器来解决它。 FilterChainProxy的问题在于它在过滤器链的末尾使用了reset方法,如果将其注入主spring安全过滤器链代理之间,则会导致问题。

自定义过滤器链只处理所需的过滤器并将控制权交还给主弹簧安全过滤器代理。以下是配置在更改后的显示方式

<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 方法中链接过滤器(与请求模式匹配)并最终将控制权传递回主spring security FilterChainProxy