私のアプリケーションには現在、特定の URL に対して 1 つの認証が定義されており、カスタム フィルターを使用して、URL から (クエリ文字列で) ユーザーの詳細を抽出することによってユーザーが認証されます。これはうまくいっています。ここで、別の URL パターンの ID 証明書を使用して新しい認証を追加したいと考えています (認証は最初のものとは完全に異なり、別のユーザー詳細サービスなどがあります)。春のセキュリティで x509 証明書認証が既にサポートされていることがわかりました。次の点を考慮して、最適な構成を理解したいと考えています。
- ユーザーが関連する認証によって認証されるさまざまな URL パターンにアクセスし、最初に 1 つの認証を試して、それが失敗した場合は別の認証を試してはいけません。これが、2 つの異なる認証マネージャーが必要になる可能性があると思う理由ですか?
- アプリケーションはすべての URL で HTTPS でなければなりません
- すべてのアプリケーションではなく、特定の URL パターンに対してのみクライアント認証が必要になるように、Tomcat を構成する必要があります。
これが私がこれまでに最初の認証のために持っているものです。
security-applicationContext.xml:
<sec:http pattern="/urlAuth1" auto-config="false" entry-point-ref="url1EntryPoint">
<sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" requires-channel="https" />
<sec:custom-filter position="PRE_AUTH_FILTER" ref="urlPreAuthFilter"/>
</sec:http>
<bean id="urlPreAuthFilter" class="com.myapp.security.UrlPreAuthenticatedFilter">
<property name="authenticationManager" ref="authenticationManager" />
</bean>
<bean id="urlPreAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService" ref="urlUserDetailsService" />
</bean>
<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider ref="urlPreAuthProvider" />
</sec:authentication-manager>
ありがとう!
編集 - 30.01.13:
次のセクションをセキュリティ context.xml に追加しました。両方の URL パターンにアクセスするときにアプリをデバッグすると、最初の URL パターン (/urlAuth1) では authenticationManager の getProviders() が urlPreAuthProvider である 1 つのプロバイダーのみを返し、2 番目の URL パターン (/certAuthTest) では返されることがわかります。 2 つのプロバイダー - 私が推測する匿名および事前認証済みプロバイダーは、デフォルトで登録されています。これは、各パターンが正しいプロバイダーを通過することを意味するため、私にとっては問題ありません。何も見逃していないことを確認したいのですが、それはあなたにとって正しいと思いますか?
<sec:http pattern="/certAuthTest" auto-config="false">
<sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" requires-channel="https" />
<sec:x509 subject-principal-regex="CN=(.*?)," user-service-ref="certUserDetailsService"/>
</sec:http>
clientAuth の web.xml 構成に関しては、もう少し読んで、これが機能するかどうかを確認します。ありがとう!