0

2 つのフィルターで Spring セキュリティを使用しています。 - クライアント証明書の x.509 認証用の 1 つのフィルター。彼のフィルターは、原則として証明書からユーザー名を抽出するだけです。- ヘッダー ベースの認証を行う 1 つのフィルター。ヘッダーには、ユーザー名とロールが必要です。このフィルターでは、プリンシパルがセキュリティ コンテキストに既に存在することを確認します。存在する場合は、ヘッダーの内容と一致することを確認します。次に、ヘッダーからロールを抽出し、付与された権限を設定します。ロールにアクセスできるようにしたいURLパターンがあります-「ROLE_USER」

ここに問題があります。リクエストは最初のフィルター (X.509) にのみヒットし、このヘッダーには明らかに役割がなく、Spring セキュリティによってアクセスが拒否されます。

フィルターの順序を切り替えることはできません。これを行うと、Spring によって提供される X.509 フィルターは単にプリンシパルが既に存在していることを認識し、役に立たないことは何もしないためです。

すべてのフィルターが処理されるまで役割チェックを延期する方法はありますか? または、私がやろうとしていることを達成するための他の方法。

これが私の春のセキュリティ設定です:

<security:http auto-config="true" entry-point-ref="customEntryPoint">
    <security:intercept-url pattern="/user/**"  access="ROLE_USER"/>
    <security:custom-filter after="EXCEPTION_TRANSLATION_FILTER" ref="x509Filter"  />
    <security:custom-filter after="FILTER_SECURITY_INTERCEPTOR" ref="headerFilter"/>
</security:http>    

x509Filter は、次のように構成された標準のスプリング セキュリティ フィルターです。

<beans:bean id="x509PrincipalExtractor" class="org.springframework.security.web.authentication.preauth.x509.SubjectDnX509PrincipalExtractor">
    <beans:property name="subjectDnRegex" value="CN=(.*?),"/>
</beans:bean>

必要に応じてスクラブされた customHeaderFilter を提供できますが、この時点ではコントロールがフィルターに到達することはないため、フィルターで何が起こるかは重要ではありません。

ヘルプ/ガイダンスをいただければ幸いです。

4

1 に答える 1

1

@Maksym からのポインターのおかげで、次のように customHeaderFilter の「after」を「before」に変更することで問題が解決されました。

<security:custom-filter before="FILTER_SECURITY_INTERCEPTOR" ref="headerFilter"/>

FilterSecurityInterceptor は、ロール チェックの適用など、HTTP リソースのセキュリティの処理を担当します。私の場合、X509Filter はプリンシパルの設定を起動しますが、権限は設定しません。これにより、インターセプターはリソースへのアクセスを拒否し、headerFilter も関係しなくなります。

headerFilter の位置を、インターセプターがセキュリティ コンテキスト内のプリンシパルと認証オブジェクトを特定の権限で正しく設定できるようにする前に設定することで、期待される動作につながります。

于 2013-03-18T19:17:45.427 に答える