いつもお世話になっております。
社員向けWebシステムにて、ログインしたユーザーが画面遷移をすると、遷移後に別ユーザーになるといった事態が発生しています。
※そのあと、画面更新・遷移をすると元のユーザーに戻る。
※姫路営業所のユーザーでログインして現場一覧を見ようと画面遷移をすると、岡山営業所の現場一覧が出てくるなど
※ログインユーザー:Aさんが仕事を入力すると、ログインユーザーがBさんとなってログ上はBさんが入力した扱いとなるなど
頻度は利用者200人ほどで1日数件ほど?
※調査のために、自動で一定時間リダイレクトする処理を書いたがリダイレクトループに引っかかって確認できず、、、
手動でF5 を押した場合は20回に1回ぐらいでした。
予想としては、同タイミングで複数ユーザーが画面遷移を行った際にそのユーザー内で取違いが行われている???
発生したのは半年前ほどからとのこと
※運用は5年前から開始(前後に特に基幹的な更新はしていない)
調べた限りでは、現象発生時にAuthComponentのstatic::$sessionKey の値が取得すべきユーザーの値と変わっておりました。
なぜこのようなことになるのかわかりますでしょうか?
以上、よろしくお願いいたします。
環境
PHP 7.2.27
cakephp 2.9.8
mysql 不明
ソース
LoginController
1<?php 2class LoginController extends AppController { 3 4 /** 5 * ログイン 6 * 7 */ 8 public function login() 9 { 10 if ($this->request->is('post')) { 11 //念のため、ログアウトしてセッション初期化 12 $this->logout(false); 13 $this->Session->destroy(); 14 CakeSession::start(); 15 16 $result = $this->checkLogin(); 17 if ($result == 'success' && $this->Auth->login($this->data['login']) ) { 18 //ログイン完了 19 //Cookieに今日の日付を登録 20 $this->setNowDate(date('Y-m-d')); 21 22 //ログを取得(以下、略) 23 24 $this->redirect($this->Auth->redirectUrl()); 25 } elseif($result == 'over') { 26 $this->Session->setFlash(__(" 27 <p>ログイン失敗回数が規定値を超えました。</p> 28 <p>システム管理者に連絡してください。</p> 29 ")); 30 } else { 31 $this->Session->setFlash(__('ユーザ名、パスワードが不正です。')); 32 } 33 } 34 } 35} 36?>
AppController
1 2 /** 3 * ユーザー情報を取得する(ユーザー取得部分のみ抜粋しています) 4 */ 5 public function getUserInfo(){ 6 $userInfo = $this->Auth->user(); 7 //このuserInfoが利用者と違う情報が入っていることがある 8 9 return $userInfo; 10 } 11
AuthComponent
1 //Cakeのライブラリ 2 public static function user($key = null) { 3 if (!empty(static::$_user)) { 4 $user = static::$_user; 5 } elseif (static::$sessionKey && CakeSession::check(static::$sessionKey)) { 6 7 //static::$sessionKey 8 //別ユーザーに切り替わるときにこの値が変わっている 9 $user = CakeSession::read(static::$sessionKey); 10 } else { 11 return null; 12 } 13 if ($key === null) { 14 return $user; 15 } 16 return Hash::get($user, $key); 17 } 18
Configure::read('Session') array(6) { ["cookie"]=> string(7) "CAKEPHP" ["timeout"]=> int(720) ["ini"]=> array(7) { ["session.use_trans_sid"]=> int(0) ["session.cookie_path"]=> string(1) "/" ["session.gc_maxlifetime"]=> int(54000) ["session.cookie_secure"]=> int(1) ["session.cookie_lifetime"]=> int(43200) ["session.name"]=> string(7) "CAKEPHP" ["session.cookie_httponly"]=> int(1) } ["defaults"]=> string(3) "php" ["cookieTimeout"]=> int(720) ["cacheLimiter"]=> string(15) "must-revalidate" }
core.php ※セッションの保存先については質問前に疑ったことがあったため、そのときにセッション情報をデータベースへの保存から サーバー側に保存するように差し替えましたが、問題改善には至りませんでした。 Configure::write('Session', array( 'defaults' => 'php', //'defaults' => 'database', ※問題発生前はデータベースでしていたが変更しても改善されず 'cookie' => 'CAKEPHP', 'timeout' => 720, //12時間 'ini' => array( 'session.gc_maxlifetime' => 54000, //15時間 ), // 'handler' => array( // 'model' => 'SessionTest' // ) ));
回答1件
あなたの回答
tips
プレビュー