1


2

シッククライアントとサーバー間のセッション管理?

私のアプリケーションはEclipseリッチクライアントであり、認証および承認機能を追加したいと思います。 ユーザーとロールはデータベースに保存され、アプリケーションにはWebベースの管理コンソールもあり、ユーザーとロールを管理できます。 この管理コンソールでSpringセキュリティを活用しています。

だからここに私の要件があります:

シッククライアントがユーザーにログインダイアログボックスを提供するようにします。 認証はサーバー側で実行する必要があり(Webサービスの場合もあります)、ロールはシッククライアントに流れ込む必要があります。 また、サーバー側でセッションをなんとか管理したいと思います。

これを行う簡単な方法は本当に考えられません。 Spring Rich Clientを使用する場合、サーバー側でSpring Securityと非常にうまく統合できることを知っています。 しかし、この時点でそれは私にとって選択肢ではありません。

これを達成する方法についてのあなたの考えを共有してください。 あなたの助けに感謝。

4 Answer


2


あなたはWebサービスに傾いているので(あなたのようです)、WS-Securityを使用してWebサービスに暗号化された情報を送信することで、リッチクライアントからユーザー情報を取得することを考えます(ユーザーIDとパスワードを想定しています) 、Webサービスに認証機能を実行させます。 また、ユーザーに関するリッチクライアントに戻したい情報(姓/名など)を返すWebサービスについても考えます。


2


最近、http://en.wikipedia.org/wiki/Challenge-response_authentication#Simple_Example_mutual_authentication_sequence [Challenge-Response-authentication]を使用して同様のアプリケーションを開発しました。 基本的に、Webサービスまたはサーバーに3つのメソッドがあります

getChallenge(username) : challenge
getSession(username, response) : key
getData(username, action?) : data

getChallengeは、クライアントが自分のパスワードでハッシュし、getSessionに送り返す値(たとえば、ランダムな値またはタイムスタンプ)を返します。 サーバーは、たとえばユーザー名とチャレンジをマップに保存します。

getSessionでは、サーバーは同じハッシュを計算し、クライアントからの応答と比較します。 正しい場合、セッションキーが生成、保存され、ユーザーパスワードで暗号化されたクライアントに送信されます。 これで、getDataを呼び出すたびにセッションキーでデータを暗号化でき、クライアントはすでにgetSessionで検証されているため、再度「ログイン」する必要はありません。

これの良い点は、パスワードがプレーンテキストで送信されることはなく、誰かがリッスンしている場合、パスワードがランダムな値でハッシュされるため、getSessionの呼び出しが偽造されにくいことです(たとえば、呼び出しをリプレイすることによって)。 getSessionからのキーはユーザーパスワードで暗号化されて送信されるため、加害者はそれを解読するためにパスワードを知っている必要があります。 最後に、getDataを呼び出すと、ユーザーセッションキーでデータが暗号化され、「気にする」必要がなくなるため、ユーザーを1回検証するだけで済みます。


1


同様の要件があると思います。 私たちの場合には:

  • ユーザーはログイン時にユーザー名とパスワードを提供します

  • これをUSERテーブルと照合します(パスワードはプレーンテキストではありません)

  • 有効な場合、セッションは20分間続きます。したくない シッククライアントがデータの取得またはデータの保存を行うたびにユーザー名とパスワードを確認します(これを行うことができました。実際、これで終わりではありませんが、余分なDBオペレーションは不要です)

このケースでは、ブール値の「アクセス権を持っているか持っていない」だけでなく、考慮すべき多くの特権があります。 私が考えているのは、グローバルに一意のセッショントークン/キーを生成することです(例: シッククライアントが何らかのソートのローカル_ThickClientSession_オブジェクトに保持するjava.util.UUID)。

シッククライアントが操作を開始するたびに、たとえば _getLatestDataFromServer()_を呼び出すと、このセッションキーがサーバーに渡されます。

アプリサーバー(例: Tomcatで実行されるJava webapp)は、このセッションキーの記録を除き、本質的にステートレスです。 午前10時にログインすると、アプリサーバーはセッションキーを午前10時20分まで有効として記録します。 10:05 amにデータを要求すると、セッションキーの有効期間は10:25 amに延長されます。 セッションに伴うさまざまな特権レベルも状態に保持されます。 これは、UUIDをキーとする単純なMapコレクションを介して実行できます。

これらの呼び出しを行う方法について:Spring HTTP Invokerをお勧めします。 それは素晴らしい。 本格的なSpring Rich Clientインフラストラクチャは必要ありません。Javaクライアントテクノロジーに簡単に統合できます。たとえば、Swingを使用してそうしています。 これは、セキュリティ目的でSSLと組み合わせることができます。

とにかくそれは私がそれに取り組むことを大体どのように計画するかです。 これが役に立つことを願っています!


0


おそらくこれはあなたを助けるでしょう:

特に注意してください(ガベージコレクションを強制するため):

ini_set(’session.gc_maxlifetime’,30);
ini_set(’session.gc_probability’,1);
ini_set(’session.gc_divisor’,1);

session.cookie_lifetimeと呼ばれる別の変数もありますが、これも変更する必要があります。

IIRCでは、少なくとも2つ以上の変数を設定する必要があります。 私は彼らが何であったかを一生覚えていませんが、1つ以上あったことは覚えています。