補足です。
ログイン画面でIDとPassを入力し
DBのIDとPassが一致すればsessionを立てています。
/**
* ログイン判定
*/
public function isLogin() {
if (is_null($this->Session->read('loginFlg'))) {
$this->redirect(FULL_BASE_URL . INDEX);
}
}
/**
* ログアウト
*/
public function userLogout() {
if (isset($this->request->data['logoutFlg'])) {
$this->Session->delete('loginFlg');
$this->redirect(FULL_BASE_URL . INDEX);
}
}
▽1
●
TransFreeBSD ベストアンサー |
ほかの方法もあるかもしれませんが...
管理画面用にセッションIDのようなもの(以下管理セッションID)を生成し、管理画面内では定時間ごとにその管理セッションIDをajaxでクライアントと送受信し続け、その際、管理セッションIDは毎回更新することで、管理画面が一つだけか判断できます。
具体的には、
管理画面がセッションにつき一つである限り重複とは判断されません。
また、ページ更新時、初回のajaxのアクセスだけは重複とはみなされません。
通常のページ遷移であれば、この時点で前回の管理セッションIDが返され、それを変更する画面もないので、次回からも正常に続行されます。
通常のページ遷移ではなく、別画面で開かれた場合、初回のajaxのアクセスだけは重複とはみなされませんが、次回アクセスまでの間に、元の別画面のページでajaxのアクセスが発生し、管理セッションIDが別画面で更新されるため、新しいほうの画面では重複の通知が行われます。
ただ、この方法では別画面を開いてから重複通知までタイムラグが発生します。
これは、ページにあるリンクを、クリックによる通常の画面遷移の場合のアクセスと、別画面を開く場合のアクセスとを、サーバ側で判別できないためです。
そのため、ajaxを用いて、以前のページの表示が継続しているかどうかを検知するためにタイムラグが発生します。
タイムラグのため、次々にテンポよく画面遷移されると重複を検知できません。
重要な決定の場面ではajaxアクセスの一周期間ウエイトして確認する必要があると思います。
以上は1セッション1画面の場合ですが、1ユーザ1画面にする場合、重複ログイン自体を拒否するか、セッション変数ではなく、DB使ってユーザーデータの一つとして1ユーザ1管理セッションIDとして扱ってください。
この場合、同時に有効期限と通常のセッションIDも記録しておけば、別セッションで重複はセッションIDが違うので即時わかります。
ajaxでのチェック間隔はサーバ負荷とタイムラグやウエイトとの兼ね合いになると思います。
あと、管理セッションIDは予測不能である必要はないのでepoch timeとpidとかでよいと思います。