6

先日、とても奇妙で恥ずかしいことが起こりました。何が起こったのかを説明する言葉がありません。

私のアプリは、すべてTomcat7でJSF2.1、Hibernate 4、SpringSecurityと統合されたSpring3を実行します。私は経営幹部レベルの重要な人物と電話をしていて、同じページで同時にテスト環境にいました。彼は、彼のページが私の個人アカウントの詳細を思いついたのとほぼ同じ瞬間に、私がナビゲートしていたページにナビゲートしに行きました。私は彼を信じていなかったので、私は彼のオフィスに歩いて行きました、そして確かに、彼はどういうわけか彼がパスワードを持っていない私のアカウントとしてログオンしました。

アプリケーションは患者の健康情報を保護するため、経営幹部レベルに何が起こったのかを完全に報告するように命じられましたが、これがどのように可能であったかがわかりません。私はコードベースを精査し、何も思いつきませんでした。正確なシナリオを何度も再現しようとしましたが、再現できませんでした。私は私が満足しているという知識に基づいた推測さえ持っていません。

Tomcatアプリケーションコンテキストの実装に保存されているセッションで安全でないスレッド操作があった可能性があると思いますが、再現できない場合はこれを証明する方法がありません。また、Spring Securityは他のリクエストよりも先にフィルターとして機能し、転送するため、おそらく他のサーブレットフィルターの1つが干渉したと思いました。他の2つは、最近追加したPrimefacesFileUploadフィルターとOmnifacesSEOフィルターでした。

Omnifacesフィルターは、実際にはPrimefaces File Uploadフィルターと干渉し、2つが互いにうまく機能するように構成を調整する必要があったので、それも可能性があると感じています。

同様の問題を引き起こしているSpringSecurityの既知のバグはありますか?ApplicationContextから誤って間違ったセッション状態を提供することに関してTomcatに既知の問題がありますか?他の誰かが同様の問題を経験したか、これについていくつかのユニークな洞察を持っていますか?

編集:これを投稿した直後に私はこれを見つけました、ほんの数日前に投稿しました:

セッションの取り違え-Apachehttpdとmod_jk、tomcat、springsecurity-他のユーザーのデータを提供

これは、Tomcatの前にApache httpd + mod_jkプラグインがあるのとほぼ同じセットアップなので、私は夢中ではありません:)

アップデート:

mod_jkまたはApacheを前面に配置しなくても、開発環境で問題を再現できたため、これを原因として確実に除外できます。

4

1 に答える 1

4

私はそれを考え出した :)

これは一種の開発者エラーでしたが、Springのばかげたデフォルトの動作でもあります。として宣言したSessionBeanというJSFマネージドBeanがありました@SessionScope。JSFとSpringを統合すると、JSF依存性注入はSpring依存性注入と競合するため、Springはそれを処理するJSFモジュールを書き直して、代わりにSpringDIをラップします。@Controllerしたがって、JSF ManagedBeanをセッションスコープとして宣言するときは、Spring Beanとしても認識されるように、アノテーションも付ける必要があります。

ただし、SpringはJSF@RequestScoped@SessionScopedアノテーションを理解していないことがわかりました。Springには、simplyと呼ばれる独自の注釈があります@Scope(value = "request|session|singleton?|etc...")

Springは私が設定したJSFスコープを認識しなかったため、新しく作成されたBeanをデフォルトのBeanとしてSINGLETONとして扱いました。

そのため、誰かがログオンするたびに、認証プリンシパルから取得したログインユーザーをキャッシュするために使用したプロパティが上書きされていました。次に、何かをしたすべての人が別のユーザーとしてログオンしました。

ちなみに、あなたがいまいましい豆を誤って構成したことを警告するために、NiceofSpring。

皆様のご協力に感謝します。これが将来の訪問者に役立つことを願っています!

于 2013-02-13T18:58:03.493 に答える