バックグラウンド
Glassfishサーバーを使用しており、シングルサインオン(SSO)を有効にして構成したため、ユーザーは一度認証するだけで複数のWebアプリにアクセスできます。各 Web アプリは FORM ベースのログイン (*j_security_check*) を指定し、開発目的でFile Realmを使用しています。これはうまくいっています。
Glassfish は、セッション (ユーザーが認証された Web アプリのパスに範囲指定) と Cookie (JSESSIONIDSSO) の両方を生成して、サーバー (および他の Web アプリ) の認証状態を維持することを識別します。
ユーザーの Web アプリ セッションで Session.invalidate() を呼び出すことにより、ユーザーに再認証を強制できます。これにより、SSO Cookie も無効になります。これはすべて正常に機能します。
問題
ユーザーが複数の同時ログインを防ぐ方法を探しています。作成されたユーザーのセッション (または SSO Cookie) をキャプチャし、ユーザー名でキー付けされたマップに保存して、誰かがログイン ページにアクセスするたびに確認できるようにし、古いセッションが存在する場合は無効にするのは自然なことのようです。
理想的には、ユーザー名 (またはプリンシパル オブジェクト) と作成されたセッションの両方にアクセスできるコンテキストで、認証後のイベントを処理したいと考えています。(私は HttpSessionListener を見ていましたが、それがリンクされているユーザーへのアクセスを提供していないようです)。
私はこれをクルージなしで(いくつか考えていると思います)、またはアプリに他のまったく新しいフレームワーク(Spring Securityなど)を導入せずに実行しようとしています。(そして、JAAS モジュール全体を実装する必要がないことを願っています...)