- PR -

ASPでの排他処理(同時ログインをさせない)

1
投稿者投稿内容
ジン
ベテラン
会議室デビュー日: 2007/07/27
投稿数: 52
投稿日時: 2008-01-11 00:01
途中からプロジェクトに参加したのですが、以下の用件のシステムを作る事になりました。

ASP(.netではありません)でログイン画面の入力内容を
利用者テーブルのユーザーIDとパスワードで認証を行うシステムがあり、
同一IDでは一人のユーザーしかログインできないようにしなければなりません。
他端末でログイン中のIDでログインしようとした場合エラーメッセージを表示します。

無理だと思ったのですが、はたしてこのような事は可能なのでしょうか?
無理なら無理なことを説明しないといけません。
よろしくお願いします。

【環境】
Access2003
IIS6


[ メッセージ編集済み 編集者: ジン 編集日時 2008-01-11 09:33 ]
OakBow
ベテラン
会議室デビュー日: 2007/09/15
投稿数: 51
投稿日時: 2008-01-11 01:02
排他処理といえば排他処理かもしれないけど、ちとタイトルは誤解されやすいかも。

で、できなくはない、かなあ。。
あまり見かけることがないので一般的かどうかは分かりませんが、多重ログインを禁止するシステムの場合、後からログインしてきたほうが有効となり、先にログインしたほうは強制ログアウトされることが多い気がします。

まず、セッション管理をIISではなくデータベースで行う。
認証で守られたページへのアクセスでは、セッション管理テーブルを常に現在時刻でUPDATEするようにする。
セッションタイムアウトはセッション管理テーブルの最終アクセス時刻と現在時刻の差から判定。
ジョブを1時間に一回程度回して、セッションタイムアウトしているレコードをDELETEする。
ログアウト処理を行った場合はジョブを待たずにすぐDELETEする。

こうしておいて、ユーザーIDとパスワードが入っている会員データテーブルとこのセッションテーブルをJOINし、セッションテーブルの特定のカラムがあり、かつセッションタイムアウトの時間が過ぎてないならログイン中の人がいるので、今まさにログインしてきた人をはねる。

こんな感じでどうでしょうか?なんか最ログインしようとしたときに問題が発生しそうな、どっか穴があるような気がしてならない仕様ですが。
セッションをデータベースに保存するやり方は、サンプルのセッションテーブルスクリプトがMSDNかなんかにあるので探してみてください。

※ちなみになんで後からのログインが有効なシステムが多いかというと、この最ログイン
の時に問題が起こりやすく、対処がめんどくさいからだと思います。多分。
※※また、Webサーバを多重化する場合にも、というかそのために、セッションをDBで管理するやり方をちょくちょく見かけます。MSDNの例もそれを目的としたものです。

[ メッセージ編集済み 編集者: OakBow 編集日時 2008-01-11 01:50 ]

[ メッセージ編集済み 編集者: OakBow 編集日時 2008-01-11 01:52 ]
ジン
ベテラン
会議室デビュー日: 2007/07/27
投稿数: 52
投稿日時: 2008-01-11 09:40
OakBowさんありがとうございます。

ログアウトかタイムアウトしか方法はありませんか…そうですよね。
顧客はブラウザを閉じたタイミングでログアウトをイメージしてます。無理ですよね…
OakBowさんの方法を代案として説明してみます。

1時間に1回動くジョブというのはASPで実現可能なんですか?
質問ばかりですいません。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2008-01-11 10:18
引用:

ジンさんの書き込み (2008-01-11 09:40) より:
1時間に1回動くジョブというのはASPで実現可能なんですか?


それは今回の問題とどういう関係があるのでしょうか?

#そもそもASPで書くことでもないとは思いますが(汗
OakBow
ベテラン
会議室デビュー日: 2007/09/15
投稿数: 51
投稿日時: 2008-01-12 09:03
タスクスケジューラありますよね。コントロールパネルの。
ジョブはデータベース内部のタスクスケジューラみたいなもので、何らかの処理を定期実行させるためのものです。バックアップとか。

ついSQL Serverの感覚でジョブって書きましたが、確かAccessにはないので、DELETE処理するASPなりWSHなりを書いて、タスクスケジューラで実行することになりますかね。

>顧客はブラウザを閉じたタイミングでログアウトをイメージしてます。無理ですよね…

まあできない訳じゃないですが、普通それは無理って言いますね。
Webアプリはユーザーからのサーバに対するアクションがあって初めて動作するので、ブラウザ閉じるってのは基本的にダメです。

詳細は検索などして調べていただいた方がよいですが、ポーリングなどの処理を実装することで一応はブラウザを閉じた数秒後にはそれを把握することができます。
JavaScriptあたりでずーーーーーっとPINGするみたいにサーバにアクセスを持続させ、それが途切れたらブラウザを閉じたと判定、とか。

ポーリングがどうしても機能として必要ってのは多分稀です。
ブラウザ閉じてログアウトってのはWebアプリ知らない人が普通に考えることなので、要件をよく聞いてどうしても必要じゃないなら、無理なのでこうしましょう、と私が先に書いたような概要で提案しますね。

「二重ログイン」「多重ログイン」ってキーワードで同様の質問のやり取りが結構見つかるので、そちらも参考にしてみてください。
ジン
ベテラン
会議室デビュー日: 2007/07/27
投稿数: 52
投稿日時: 2008-01-15 12:29
返事遅くなりました。みなさんありがとうございます。
ポーリングですか、結構無茶な感じですね。
後のログインのみ有効にする対応に落ち着きました。
ありがとうございました。
1

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