こんにちは、Spring Security の専門家です。
私の要件。
私は2セットのUIを持っています。1 つのセットはログインとログアウトで、基本認証 (ユーザー名パスワード資格情報を使用) を使用して春のセキュリティで保護する必要があります。私は HybridAuthenticationProvider
実装を使用AuthenticationProvider
してそれを達成しました。
2 番目以降の UI は、HTTP ヘッダーでトークンを渡すことによってサポートする必要があります。+のCustomAuthenticationEntryPoint
実装を使用し、それを達成できました。AuthenticationEntryPoint
GenericFilterBean
上記の両方の機能を実現するために、単一の 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 構成の順序を確認してください