Spring 3.0.0.M4 から 3.0.0.RC1 に、Spring Security 3.0.0.M2 から 3.0.0.RC1 にアップグレードした後、私のように _authenticationManager を定義する代わりに、security:authentication-manager タグを使用する必要がありました。 M4/M2で使用されていました。私はそれを定義するために最善を尽くしましたが、最終的には次のようになりました。
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider user-service-ref="userService">
<security:password-encoder hash="plaintext"/>
</security:authentication-provider>
</security:authentication-manager>
一度に 1 つずつ単体テストを実行すると、これはうまく機能し、ほとんどの AJAX 要求でも問題なく機能しますが、一見ランダムに、データベース セッションが作業の途中で閉じられたように見えるトランザクションで奇妙なエラーが発生します。これらのエラーを引き起こす方法は、同じクライアントからさまざまなコントローラーにさまざまな AJAX 要求を送信するだけで、少なくともそのうちの 1 つがランダムに失敗します。次回試してみると、それはうまくいき、別のものは失敗します。
エラーは私の userDAO で最も頻繁に発生しますが、他の DAOS でもかなり頻繁に発生し、例外には少なくとも次のものが含まれます。
- 「java.sql.SQLException: ResultSet が閉じられた後、操作は許可されていません」
- "org.hibernate.impl.AbstractSessionImpl:errorIfClosed(): セッションが閉じられました!"
- 「com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2439) での java.lang.NullPointerException」
- 「java.util.LinkedHashMap$LinkedHashIterator.nextEntry での java.util.ConcurrentModificationException (不明なソース)」
- 「org.hibernate.LazyInitializationException: ローディング コレクションへの不正なアクセス」
- 等...
以前は、_authenticationManager Bean を定義していましたが、同じリクエストが魅力的に機能していました。しかし、RC1 では、それを定義することはできなくなりました。以前は次のように表示されていました。
<bean id="_authenticationManager" class="org.springframework.security.authentication.ProviderManager">
<property name="providers">
<list>
<bean class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="userService"/>
<property name="passwordEncoder">
<bean class="org.springframework.security.authentication.encoding.PlaintextPasswordEncoder" />
</property>
</bean>
</list>
</property>
</bean>
security:authentication-manager を誤って定義したため、同じクライアントからの複数の要求に対してトランザクションを共有していませんか? 別の方法で定義する必要がありますか、それとも他のセキュリティであるBeanを定義する必要がありますか?
データベース セッションを閉じてしまうような誤解はありますか? 私の頭では、各リクエストには独自のデータベース接続とトランザクションがあります。すべてのゲッターとセッターは同期されたメソッドであるため、並行性の問題はまったくないはずです。UI が要求を行うすべての REST コントローラーは GET 要求であり、読み取り専用の作業を行います。私の知る限り、これらのリクエスト中に INSERT/UPDATE/DELETE は 1 回も実行されません。これを確認するためにデータベース ログを調べました。
これらの競合状態を回避する方法についてのご提案をお待ちしております。
乾杯
ニック
PS、問題が security:authentication-manager にあることをより具体的にするように質問を更新しました(または、それが素晴らしいものである可能性があるというヒントがあれば、私には思えます) m 3.0.0.RC1 以降、自分の _authenticationManager の代わりに使用することを余儀なくされました
PPS、_authenticationManager を定義できなくなったことを理解させてくれたスレッドは次のとおりです: SpringSource フォーラムの投稿