5

最近、あるユーザーが別のユーザーのデータを提供されるという深刻な問題に直面しました。この問題を再現することはほとんど不可能です。

Spring-security によって提供される標準のlogged-users-management を使用しています。問題は、ユーザーをインスタンス変数に保存することや、アプリの同様の同時実行性にあることではないと確信しています。

問題が SpringSecurity または Tomcat 自体にあるとは思えません。

フロントサーバーは apache httpd で、ajp コネクタ (mod_jk) 経由で tomcat に接続されています。ロード バランシングは行っていません (httpd は SSL、いくつかの URL の書き換え、およびいくつかの php モジュールの提供のみを考慮します)。

セットアップは次のとおりです。

## OS
OS Name:        Linux 
OS Version:     2.6.32-5-686
Architecture:   i386

## Apache httpd
Server version: Apache/2.2.16 (Debian)
Server built:   Sep  4 2011 20:27:42

## mod_jk
mod_jk/1.2.30 (installed via apt-get)

## JVM
JVM Version:    1.6.0_18-b18
JVM Vendor:     Sun Microsystems Inc.

## Tomcat
Server version: Apache Tomcat/6.0.28
Server built:   February 12 2011 1443

このセッションの混同は httpd / mod_jk のせいなので、唯一の解決策は apache httpd を削除することです。しかし、この一般的で広く使用されている構成を終了する前に、誰かが同様の問題に直面したかどうかを知りたい.

私が見つけた唯一の同様の問題は、ロード バランシングまたは mod_jk でした。

同様の問題に直面したことがありますか?ヒント、アイデア、リンク、または経験は高く評価されます。ありがとう!

4

5 に答える 5

1

これまでのところ、バグを再現することはできませんでしたが、mod_jkで同じ問題に直面している人がいることがわかりました。

これで、次の設定で実行されます。

そして、mod_jkをmod_proxy_httpに切り替えることを計画しています。

解決策がバグを修正することを保証できない(そして同じ問題に直面している人は誰も保証できなかった)ので、私はこの質問に答えないままにしておきます。

誰かが情報を共有できたら、とてもありがたいです!ありがとう。

于 2013-02-19T09:33:07.417 に答える
1

考えられる問題の 1 つは、2 回目のログイン試行である可能性があります。次のケースを検討してください。

  • ユーザーは、2 つのログイン フォームを含む 2 つのブラウザ タブを開きます。
  • タブ 1: user_1 としてログインします。HTTP セッションにデータをロードします。
  • タブ 2: user_2 としてログインします。HTTP セッションにデータをロードします。

ほとんどのブラウザーでは、同じ HTTP セッションになります。したがって、実際には、user_1 と user_2 からのデータが 1 つの HTTP セッションに結合されます。セッション オブジェクトを使用するすべてのページが影響を受ける可能性があります。

ここには 2 つのオプションがあります。

  • この状況を防ぎます。2 回目のログイン試行を検出し、最初にログアウトするようにユーザーに依頼します。Spring Security を使用すると簡単です。以下のコードを参照してください。
  • ブラウザのタブごとに 1 つのアカウントがどうしても必要な場合は、ユーザー名ごとにセッション データをマップに保存できます。

同時セッション制御機能のおかげで、2 回目のログイン試行を防ぐことができます。

<http>
    ...
    <session-management>
        <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
    </session-management>
</http>

アプリケーションですでに実行されていますか?

于 2013-02-06T15:22:34.893 に答える
1

同時セッションの問題を除外すると、ビジネス ロジック自体に欠陥があり、別のユーザーのデータを提供している可能性がほとんどありません。「現在のユーザー」がどのように決定され、後で使用されるかのコードサンプルを投稿してください。

編集: 本番環境でのみ現れるバグは、競合状態 ( http://en.wikipedia.org/wiki/Race_condition ) によって引き起こされることがよくあります。コードで可能な限りローカル変数を使用し、必要に応じてロック/同期を使用するようにしてください。

于 2013-02-06T21:05:44.697 に答える
0

JSF と Spring を統合すると、JSF 依存性注入が Spring 依存性注入と競合するため、Spring はそれを処理する JSF モジュールを書き直して、代わりに Spring DI をラップするだけにしました。そのため、JSF ManagedBean を Session Scoped として宣言するときは@Controller、Spring Bean としても認識されるようにアノテーションも付与する必要があります。

詳細については、これを参照してください。

于 2013-04-20T11:01:56.573 に答える