2012-03-21 12 views
3

私は、Spring SecurityでGAE + GWTアプリケーションの認証レイヤーを実装しています。私の質問は、与えられたユーザープロファイルに対する同時セッションに関するものです。私は、同時に同じアカウントで2回ロギングするユーザーを禁止したい。App EngineとSpring Security:同時セッション

は、いくつかの研究の後、私は私が使って春のセキュリティでこれを行うことができることを発見した:

<listener> 
<listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>  
</listener> 

そしてapplicationContext.xmlを中

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

HttpSessionEventPublisherが受け取る

web.xmlの

sessionDestroyed()がHttpSessionListenerで呼び出されるたびに発生するイベントです。しかし、私が知る限り、App Engineは決してそれを呼びません。 issue about this

Spring SecurityとApp Engineでセッションの同時実行制限を実装する方法を教えてください。

+0

まず、このコンテキストで「同時に」ということを定義する必要があります。 HTTPはリクエストベースであり、接続ベースではありません。ユーザーがサイトの使用を停止したときには通知できません。リクエストの送信を停止するだけです。 –

+0

あなたは正しいです...私がそれを言ったとき、私は "セッション時間"を言うことを意図しました。今、私は_ah_SESSIONエンティティに、特定のユーザープロファイルで使用されている最後のセッションIDを照会しています。セッションが期限切れでない場合(_expires> now)、ユーザープロファイルが使用中であり、新しい接続を拒否したと想定します。私は生産で試してみる必要があります。 –

+0

これは望ましくない動作のようです。ノートパソコンを明示的にログアウトせずに閉じ、ログインするためにデスクトップコンピュータにアクセスするユーザーは拒否されます。あなたが本当に必要ならば、他のセッションを自動的にログアウトする方がはるかに優れています。 –

答えて

0

GAEはクラウドソリューションであり、マルチJVM上でさまざまなhttpセッションにデータストアにセッションを格納し、それを他のインスタンスに分散するとうまく動作しますあなたの開発環境ではライブサーバー上に落としてしまいますので、春のセキュリティでGAE上で単一のセッションソリューションを使用することはできません。

+0

GAEはキャッシュを介してセッションオブジェクトを追跡し、_ah_SESSIONというデータストアのコレクションを保持します。期限切れのセッション(_expires> now)を照会することは可能です。 –

+0

唯一のことは、HttpSessionListenerのsessionDestroyed()が呼び出されないため、これらのデータを自分で空にすることです。 –

関連する問題