1

こんにちは、Spring Security の専門家です。

私の要件。

私は2セットのUIを持っています。1 つのセットはログインとログアウトで、基本認証 (ユーザー名パスワード資格情報を使用) を使用して春のセキュリティで保護する必要があります。私は HybridAuthenticationProvider実装を使用AuthenticationProviderしてそれを達成しました。

2 番目以降の UI は、HTTP ヘッダーでトークンを渡すことによってサポートする必要があります。+のCustomAuthenticationEntryPoint実装を使用し、それを達成できました。AuthenticationEntryPointGenericFilterBean

上記の両方の機能を実現するために、単一の spring-security.xml を作成したいと思います。最終的に、認証情報で保護したいログイン/ログアウト ページ ( AuthenticationProvider) と、トークンで保護したい残りの UIページ ( ) を組み合わせた一連の UI ページができAuthenticationEntryPointました。

spring-security.xml (後述) にすべてまとめると、次の例外が発生します。

例外 :

例外は org.springframework.beans.factory.BeanCreationException: 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0' という名前の Bean の作成中にエラーが発生しました: Bean 'org.springframework.security.authentication.ProviderManager#0 への参照を解決できません' Bean プロパティ 'authenticationManager' の設定中。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'org.springframework.security.authentication.ProviderManager#0' という名前の Bean 作成エラー: 一致するコンストラクターを解決できませんでした (ヒント: 単純なパラメーターのインデックス/タイプ/名前の引数を指定しますタイプのあいまいさを避けるため) org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) で

サンプル Spring-security.xml

<security:http auto-config="true" authentication-manager-ref="hybridAuthenticationProvider">
    <security:intercept-url pattern="/auth/login" access="ROLE_USER" />
</security:http>

<security:http realm="Protected API" use-expressions="true"
    auto-config="false" create-session="stateless" entry-point-ref="CustomAuthenticationEntryPoint">
    <security:custom-filter ref="authenticationTokenProcessingFilter"
        position="FORM_LOGIN_FILTER" />
    <security:intercept-url pattern="/welcome"
        access="isAuthenticated()" />
</security:http>


<bean id="CustomAuthenticationEntryPoint"
    class="com.ckatudia.tutorial.authentrypoint.CustomAuthenticationEntryPoint" />

<bean id="authenticationTokenProcessingFilter"
   class="com.ckatudia.tutorial.authentrypoint.AuthenticationTokenProcessingFilter" />

<bean id="TokenUtils"
    class="com.ckatudia.tutorial.authentrypoint.TokenUtils" />

<bean id="authenticationManager"
    class="com.ckatudia.tutorial.auth.TokenAuthenticationProvider" />

<bean id="hybridAuthenticationProvider"
      class="com.ckatudia.tutorial.auth.HybridAuthenticationProvider">
</bean>  
    
<security:authentication-manager>
    <security:authentication-provider ref="hybridAuthenticationProvider"/>
</security:authentication-manager>

authentication-manager-ref="hybridAuthenticationProvider" を削除すると、展開中に次の例外が発生しました。

例外 :

org.springframework.beans.factory.BeanCreationException: 'org.springframework.security.filterChainProxy' という名前の Bean を作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は java.lang.IllegalArgumentException: ユニバーサル マッチ パターン ('/**') がフィルタ チェーン内の他のパタ​​ーンの前に定義されているため、無視されます。security:http 名前空間または FilterChainProxy Bean 構成の順序を確認してください

4

1 に答える 1

1

http 要素の「パターン」属性がデフォルトで「/**」に設定されているため、この例外があります。特定のパターンのない 2 つの「http」要素があるため、デフォルト値が使用され、それぞれが同じ一連の uis をカバーします。

2 つに異なるパターンを追加してみてください。

<http pattern="/foo/**" ... >
  ...
</http>

<http pattern="/bar/**" ... >
  ...
</http>
于 2013-05-07T18:12:45.517 に答える