1

標準 Http フィルターの複数のカスタム実装を Spring Security 名前空間 FilterChainProxy に追加するにはどうすればよいですか? after、before、または position 属性を使用して、1 つのフィルターをチェーンに追加できることはわかっています。しかし、どうすれば複数のフィルターを追加できますか?. ここに私のセキュリティ設定ファイルがあります

<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を追加するにはどうすればよいですか。どちらも単純な GenericFilterBean 実装です。

チェーン リストに上記の 2 つのフィルターを含む別のFilterChainProxy Bean を作成して、その Bean を名前空間構成のカスタム フィルターとして LAST の前に追加しようとしましたが、フィルターが機能しているように見えますが、JSF ナビゲーションが壊れており、特に commandLink (AJAX だと思います)この FilterChainProxy を使用すると呼び出しが失敗します)

これら 2 つのフィルターと、その他の可能なフィルターを Spring Security フィルター チェーンに追加する方法について、誰かアイデアを提案できますか?

4

1 に答える 1

2

私が抱えていた問題の解決策を見つけました。スプリング セキュリティ フィルター チェーン プロキシを使用してフィルターをチェーンする代わりに、独自のフィルター チェーンを実装することで解決しました。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 に戻します。

于 2012-08-04T23:30:27.323 に答える