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 を提供できますが、この時点ではコントロールがフィルターに到達することはないため、フィルターで何が起こるかは重要ではありません。
ヘルプ/ガイダンスをいただければ幸いです。