私はTomcat 6.0.32、Spring Security 3.0.5を使用しています春のセキュリティセッションを無効にすることはできますか?
私のWebアプリケーションでは、一部のユーザーが他のユーザーの権限を変更する権限を持っています。これが起こると、権限が変更されたユーザーのセッションが無効になります。これは可能でしょうか?
私はTomcat 6.0.32、Spring Security 3.0.5を使用しています春のセキュリティセッションを無効にすることはできますか?
私のWebアプリケーションでは、一部のユーザーが他のユーザーの権限を変更する権限を持っています。これが起こると、権限が変更されたユーザーのセッションが無効になります。これは可能でしょうか?
通常、HttpSession
にアクセスする唯一の方法はHttpServletRequest
オブジェクトを使用するため、コンテナ固有のAPIを使用せずにアカウント情報を変更するとすぐにユーザーセッションを無効にすることはできません。
代わりに、メモリ内のストアにユーザー名をキャッシュし、フィルタまたはカスタムAccessDecisionVoter
のいずれかで参照できます。フラグは実際には一時的なので(サーバーの再起動後は無関係です)、すべての要求に対してデータベースクエリのパフォーマンスヒットを避ける方が良いので、ユーザーテーブルにフラグを使用することは本当に良い考えではありません。
この種のものにはblog article on using custom votersがあります。時代遅れですが、一般的なアプローチは健全です。
もう1つの方法は、セッション管理機能の一部であるSpring SecurityのSessionRegistry
を使用することです。通常、これはユーザーが持つことができるセッションの数を制限するために使用されますが、list currently authenticated usersにも使用できます。また、セッションの有効期限をマークすることもできます。
完全にログアウトするのではなく、ユーザーの権限をリロードするだけのアイデアかもしれません。
HTTPSessionオブジェクトには無効化メソッドがあります。ユーザーがいくつかのアクセス権を変更すると、このメソッドを呼び出して現在のセッションに対して無効化して再ロードする必要があります。
複数のサーバーでアプリケーションを実行していると仮定すると、これをすべてのサーバーで実行する方法が必要です。
ユーザprvisが変更されたときに更新されるユーザテーブル(または同等のもの)にタイムスタンプフィールドを追加します。
現在のセッションが認証されているかどうかをチェックし、DBのユーザのタイムスタンプがセッションの作成時間よりも長いことを確認するサーブレットフィルタを作成します。もしそうなら、セッションを無効にしてどこかにリダイレクトしてください。
このフィルタは、Spring Securityフィルタの後に来る必要があります。
複数のサーバーでアプリケーションを実行していない場合は、SessionRegistryを使用できます。
フラグの代わりにタイムスタンプを使用するように変更しました。 – sourcedelica
ユーザprvisとは何ですか? – Stephane
あなたのシナリオは2回目のログインを拒否することですか?最初のログインをログアウトしないでください。 – Stephane
私はこれがあなたが必要とするものだと信じています。ログインしているユーザーの一覧を取得し、必要のないユーザーのセッションを無効にします。
アイデアと有益なリンクをありがとう。私はそれにショットをつけて、それがどのように進むのかを知らせます。 – kasdega
これは、アプリが1台のサーバーで実行されている場合にのみ機能します。それは...ですか? – sourcedelica
現在のところ、1台のサーバーにしかありません。私たちが複数のサーバーに移動する際には、あなたの注意点を念頭に置いていきます。 – kasdega