2

私のアプリケーションには現在、特定の URL に対して 1 つの認証が定義されており、カスタム フィルターを使用して、URL から (クエリ文字列で) ユーザーの詳細を抽出することによってユーザーが認証されます。これはうまくいっています。ここで、別の URL パターンの ID 証明書を使用して新しい認証を追加したいと考えています (認証は最初のものとは完全に異なり、別のユーザー詳細サービスなどがあります)。春のセキュリティで x509 証明書認証が既にサポートされていることがわかりました。次の点を考慮して、最適な構成を理解したいと考えています。

  1. ユーザーが関連する認証によって認証されるさまざまな URL パターンにアクセスし、最初に 1 つの認証を試して、それが失敗した場合は別の認証を試してはいけません。これが、2 つの異なる認証マネージャーが必要になる可能性があると思う理由ですか?
  2. アプリケーションはすべての URL で HTTPS でなければなりません
  3. すべてのアプリケーションではなく、特定の 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 構成に関しては、もう少し読んで、これが機能するかどうかを確認します。ありがとう!

4

1 に答える 1

3

必要なURLパターンごとに個別の認証マネージャーBeanを宣言し、要素のauthentication-manager-ref属性を使用してそれらを個々のフィルターチェーンに割り当てることができます。<http />

<http pattern="/someapi/**"  authentication-manager-ref="someapiAuthMgr">
    ...
</http>

ProviderManager個々の認証マネージャには標準のBeanを使用できます。

すべてのリクエストにHTTPSを適用するには、標準のweb.xml設定を使用できます。

クライアント証明書の認証は、SSL接続が確立されたときに行われます。だからあなたはそれを持っているか持っていないかのどちらかです。clientAuthTomcatコネクタの設定を調べます。クライアント証明書を要求する場合は「want」に設定できますが、SSL接続を成功させるために証明書を要求する必要はありません。

于 2013-01-29T18:25:58.053 に答える