自己解決しました。
やり方はたくさんあるようですが、私はトークンを使うことで解決しました。
認証する時にランダムでトークンを発行し、それをDBに入れると同時にsetUser()で認証をします。
ログアウトする時はDBのトークンとセッションを破棄する。
あとは、AppControllerのBeforeFilterにセッションが持つトークンとDBにあるトークンをチェックし、一致しなかった場合(誰かログインしてDBのトークンが更新されてしまった場合)は、二重認証だと判断し、セッションを破棄させて強制的にログアウトさせる、という形で実装しました。
すべてのページにてセッションとDBのトークンを比較するのでパフォーマンスは低いと思いますが、自分の実力ではこれがベストかな、と。(涙)
PHP
1// UsersControllerのLogin()中
2// ログインの時間制限があるのか判断するための処理(例外処理必要)
3 $query = $this->Users->find()->where(
4 ['account' => $this->request->data['account'],
5 'customer_no' => $this->request->data['customer_no']
6 ]);
7 $targetUser = $query->first();
8
9 $this->Users->initUser($targetUser); // トークンを発行するためのFunction
10 $user = $this->Auth->identify();
11 if ($user)
12 {
13 $this->Auth->setUser($user);
14 return $this->redirect($this->Auth->redirectUrl());
15 }
16
17// UsersControllerのLogout()中
18// ログイン状態の利用者情報をセッションから読み取る。
19 $account = $this->Auth->User('account');
20 $customer_idx = $this->Auth->User('customer_idx');
21 // DBのTokenをNullに更新
22 $query = $this->Users->query();
23 $query->update()
24 ->set(['token' => null,
25 'modifier' => $account,
26 'modified' => Time::now()])
27 ->where(['customer_idx' => $customer_idx, 'account' => $account])
28 ->execute();
29
30 //ログアウト処理、セッションを消してログインページに移動させる。
31 $this->request->session()->destroy();
32 $this->Flash->success(__('成功的にログアウトしました。'));
33 return $this->redirect($this->Auth->logout());
34
35// UsersTable.phpのinitUser()の定義
36 public function initUser($targetUser)
37 {
38 //ログイン成功時、ランダムでトークンを発行する。
39 $token = hash('sha256', date("YmdHis").$_REQUEST['customer_no']);
40 $target->token = $token;
41
42 $this->save($targetUser);
43 }
44
45// AppController.phpのBeforeFilter
46public function beforeFilter(Event $event)
47{
48 // 二重認証をチェックする
49 // セッションとトークンをチェックしてなかったら強制ログアウト、
50 // あればセッションのトークン値とDBのトークン価を比較する。
51 // トークン値が一致する場合は何もしなくていい、
52 // 不一致する場合はそのセッションを破棄しログインページに戻す。
53
54 // セッションを比較するための準備
55 $session_token = $this->Auth->user('token');
56 if(isset($session_token))
57 {
58 $account = $this->Auth->user('account');
59 $customer_idx = $this->Auth->user('customer_idx');
60
61 $query = $this->Users->find()->where(
62 ['account' => $account,
63 'customer_idx' => $customer_idx
64 ]);
65 $user = $query->first();
66
67 $db_token = $user->token;
68 // セッションのトークン価とDBのトークン価が一致しない場合は、強制的にログアウトさせる。
69 if($session_token != $db_token)
70 {
71 $this->Session->destroy();
72 $this->Flash->warning(__('トークン価が更新されましたのでログアウトされました。'));
73 $this->redirect($this->Auth->logout());
74 }
75 }
76}
77
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。