2011-12-12 6 views

答えて

12

通常、HttpSessionにアクセスする唯一の方法はHttpServletRequestオブジェクトを使用するため、コンテナ固有のAPIを使用せずにアカウント情報を変更するとすぐにユーザーセッションを無効にすることはできません。

代わりに、メモリ内のストアにユーザー名をキャッシュし、フィルタまたはカスタムAccessDecisionVoterのいずれかで参照できます。フラグは実際には一時的なので(サーバーの再起動後は無関係です)、すべての要求に対してデータベースクエリのパフォーマンスヒットを避ける方が良いので、ユーザーテーブルにフラグを使用することは本当に良い考えではありません。

この種のものにはblog article on using custom votersがあります。時代遅れですが、一般的なアプローチは健全です。

もう1つの方法は、セッション管理機能の一部であるSpring SecurityのSessionRegistryを使用することです。通常、これはユーザーが持つことができるセッションの数を制限するために使用されますが、list currently authenticated usersにも使用できます。また、セッションの有効期限をマークすることもできます。

完全にログアウトするのではなく、ユーザーの権限をリロードするだけのアイデアかもしれません。

+0

アイデアと有益なリンクをありがとう。私はそれにショットをつけて、それがどのように進むのかを知らせます。 – kasdega

+0

これは、アプリが1台のサーバーで実行されている場合にのみ機能します。それは...ですか? – sourcedelica

+0

現在のところ、1台のサーバーにしかありません。私たちが複数のサーバーに移動する際には、あなたの注意点を念頭に置いていきます。 – kasdega

0

HTTPSessionオブジェクトには無効化メソッドがあります。ユーザーがいくつかのアクセス権を変更すると、このメソッドを呼び出して現在のセッションに対して無効化して再ロードする必要があります。

2

複数のサーバーでアプリケーションを実行していると仮定すると、これをすべてのサーバーで実行する方法が必要です。

  1. ユーザprvisが変更されたときに更新されるユーザテーブル(または同等のもの)にタイムスタンプフィールドを追加します。

  2. 現在のセッションが認証されているかどうかをチェックし、DBのユーザのタイムスタンプがセッションの作成時間よりも長いことを確認するサーブレットフィルタを作成します。もしそうなら、セッションを無効にしてどこかにリダイレクトしてください。

このフィルタは、Spring Securityフィルタの後に来る必要があります。

複数のサーバーでアプリケーションを実行していない場合は、SessionRegistryを使用できます。

+0

フラグの代わりにタイムスタンプを使用するように変更しました。 – sourcedelica

+0

ユーザprvisとは何ですか? – Stephane

+0

あなたのシナリオは2回目のログインを拒否することですか?最初のログインをログアウトしないでください。 – Stephane

関連する問題