- PR -

二重ログイン禁止について

投稿者投稿内容
tomo
会議室デビュー日: 2006/06/18
投稿数: 6
投稿日時: 2006-06-25 21:37
現在サーバサイドJavaを学習しています。
そこでログイン認証を使ったサンプルプログラムを作成しています。

ログインは、入力されたユーザIDとパスワードが
DBに登録されているユーザIDとパスワードと一致するかを
認証させています。

しかし、単純に上記の方法で認証確認する方法だと、同じユーザIDとパスワードを
使うと同じようにログインされてしまいます。

この同一ユーザの二重ログインを防ぐ方法に関して、参考になるサイトや書籍、
もしくは考え方のヒントなどを頂ければと思います。

何卒よろしくお願いします。
あつしfx
大ベテラン
会議室デビュー日: 2002/04/08
投稿数: 104
お住まい・勤務地: XPできるところ
投稿日時: 2006-06-25 23:08
当然のことですが、システムはユーザーがログインしていることを知っていなくてはいけません。
これをDBなりに記録し、ログイン時に該当ユーザーがログイン済みかをチェックすれば二重ログインは防げるはずです。

ただし、時間切れを設定しないとブラウザをクローズしたら2度とログインできないことになります。

詳しいことはセッションやログイン済みなどで検索してください。
_________________
http://aglabo.com/ @Homepage
http://furukawa-select.com/mt/ @Blog
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-06-25 23:09
こんなページが参考になるでしょうか。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14430&forum=12
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=12258&forum=12
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-06-25 23:45
Web アプリケーションで多重ログインを禁止する場合は、遅いもの勝ちにしないと、非常に使いにくいものになります。すなわち、コンピューターAからログインしていたら、コンピューターBからのログインを禁止するのではなく、コンピューターBのログインセッションを開始し、コンピューターAからのログインセッションを無効にします。
もし早い者勝ちにしてしまうと、コンピューターAからのセッションが残ったままになった場合、あらたにログインし直すことができなくなってしまいます。

で、どうロジックを組むかですが、やっぱりユーザーごとになんらかのフラグを持たせることになると思います。ログイン時にユーザーに紐付くカウンターをインクリメント(はあくまでも例ですが)して、セッションがそのカウンター値を持つかどうかを毎回チェックするような感じでしょうか。結構面倒くさいですね。

なお、理想としては、多重ログインでもきちんと処理できるようなアプリケーションの作りにして、最終的に、多重ログインをはじく機構を追加したほうが良いでしょう。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2006-06-26 11:39
 ログイン時に、クラス変数にでも、ユーザーIDを書き込んで、
ログオフ時やセッションタイムアウト時等に、これを削除するようにし、
ログイン時に常にこれをチェックすれば良いのでは?
クラス変数にはMapを使えば良いと思います。
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2006-06-26 13:53
うちでも多重ログイン禁止のシステムを作りました。
ログイン中のユーザ一覧をデータベース上に持たせるようにしています。
そして、ログイン/ログアウト毎にテーブルを更新し、
ログインが必要なページへのアクセスの際にはこのテーブルに
レコードがあれば許可、無ければ不許可、としました。
同じユーザが複数ログインしたときのユーザの識別は、
UUIDで行っています。

先にログインしたユーザと後にログインしたユーザのどちらを優先させるか
については、unibonさんの指摘がありますのでそちらに譲ります。
うちも遅いもの勝ちです。

なお、メモリ上に一覧を置く方法を挙げている人もいますが、
うちでメモリ上に置かなかったのは、コンテナをクラスタ化したときに
コンテナ間で共有できないからでした。
(クラスタ化するほどのお客さんがまだいないのは秘密)

tomoさんがどこまで要求しているのか分かりませんが、
別に大規模な業務で使うとか考えていなければ、
メモリとか簡単な仕掛けで十分だと思います。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2006-06-26 14:33
引用:

koeさんの書き込み (2006-06-26 13:53) より:
なお、メモリ上に一覧を置く方法を挙げている人もいますが、
うちでメモリ上に置かなかったのは、コンテナをクラスタ化したときに
コンテナ間で共有できないからでした。
(クラスタ化するほどのお客さんがまだいないのは秘密)


 2重ログインを防ぐ方法だけ解れば良いだけですから、
その際に、メモリーを使おうがDBやファイルを使おうが、
それは今回の本質では無いので無関係ですね。
とりあえず、メモリーを使う方法で実装して、
それからDBを使う方法やファイルを使う方法を実装してみれば、
後々役に立つと思いますよ。
tomo
会議室デビュー日: 2006/06/18
投稿数: 6
投稿日時: 2006-06-26 23:58
たくさんのご返答を頂き有り難うございます。

まだまだ学習の一環として、プログラム作成を行っている段階ですが、
メモリやDBを使う方法など、考え方も含めて非常に参考になりました。

知識が足りない状況なので、皆様の返信をすべて理解出来てはいませんが、
頑張って身に付けて行きたいと思います。

ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)