質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.36%

Cakephp2のAuth処理で、利用者とは別のユーザーIDで処理が実行されるときがある

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 470

K.T_build

score 29

いつもお世話になっております。
社員向けWebシステムにて、ログインしたユーザーが画面遷移をすると、遷移後に別ユーザーになるといった事態が発生しています。
※そのあと、画面更新・遷移をすると元のユーザーに戻る。
※姫路営業所のユーザーでログインして現場一覧を見ようと画面遷移をすると、岡山営業所の現場一覧が出てくるなど
※ログインユーザー:Aさんが仕事を入力すると、ログインユーザーがBさんとなってログ上はBさんが入力した扱いとなるなど

頻度は利用者200人ほどで1日数件ほど?
※調査のために、自動で一定時間リダイレクトする処理を書いたがリダイレクトループに引っかかって確認できず、、、
手動でF5 を押した場合は20回に1回ぐらいでした。
予想としては、同タイミングで複数ユーザーが画面遷移を行った際にそのユーザー内で取違いが行われている???

  
発生したのは半年前ほどからとのこと
※運用は5年前から開始(前後に特に基幹的な更新はしていない)

調べた限りでは、現象発生時にAuthComponentのstatic::$sessionKey の値が取得すべきユーザーの値と変わっておりました。
なぜこのようなことになるのかわかりますでしょうか?

以上、よろしくお願いいたします。

環境

PHP 7.2.27
cakephp 2.9.8
mysql  不明

ソース

<?php
class LoginController extends AppController {

    /**
     * ログイン
     *
     */
    public function login()
    {
        if ($this->request->is('post')) {
            //念のため、ログアウトしてセッション初期化
            $this->logout(false);
            $this->Session->destroy();
            CakeSession::start();

            $result = $this->checkLogin();
            if ($result == 'success' && $this->Auth->login($this->data['login']) ) {
                //ログイン完了
                //Cookieに今日の日付を登録
                $this->setNowDate(date('Y-m-d'));

                //ログを取得(以下、略)

                $this->redirect($this->Auth->redirectUrl());
            } elseif($result == 'over') {
                $this->Session->setFlash(__("
                        <p>ログイン失敗回数が規定値を超えました。</p>
                        <p>システム管理者に連絡してください。</p>
                "));
            } else {
                $this->Session->setFlash(__('ユーザ名、パスワードが不正です。'));
            }
        }
    }
}
?>
    /**
     * ユーザー情報を取得する(ユーザー取得部分のみ抜粋しています)
     */
    public function getUserInfo(){
        $userInfo = $this->Auth->user();
        //このuserInfoが利用者と違う情報が入っていることがある

        return $userInfo;
    }
    //Cakeのライブラリ
    public static function user($key = null) {
        if (!empty(static::$_user)) {
            $user = static::$_user;
        } elseif (static::$sessionKey && CakeSession::check(static::$sessionKey)) {

    //static::$sessionKey
  //別ユーザーに切り替わるときにこの値が変わっている
            $user = CakeSession::read(static::$sessionKey);
        } else {
            return null;
        }
        if ($key === null) {
            return $user;
        }
        return Hash::get($user, $key);
    }
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'
//         )
    ));
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • nojimage

    2020/05/13 21:26

    AuthComponent::$sessionKey は通常アプリケーション内で不変です。アプリケーションコードのどこかに AuthComponent::$sessionKey を書き換えている個所はありませんか?
    あとは、セッション格納の設定/処理に不備があり、セッションの書き込み先が重複してしまっているとかでしょうか。
    Configure::read('Session') で取得できるセッションの設定値も提示してください。

    キャンセル

  • nojimage

    2020/05/13 21:27

    もしセッションの書き込み先がデータベースであれば、そのセッションテーブルのスキーマ定義も提示してください

    キャンセル

  • K.T_build

    2020/05/14 11:02

    回答ありがとうございます。
    Configure::read('Session') での出力内容を追加しました。また、セッションの書き込み先ですが、データベースにしていましたが、問題発生した際にphp側(サーバー側?)に変えても問題改善に至りませんでした。

    キャンセル

回答 1

checkベストアンサー

0

プロキシサーバー等で何らかのキャッシュ機構が働き、他のユーザーのレンダリング結果を表示しているかもしれません。

ControllerのbeforeFilterあたりで、レスポンスにキャッシュ無効の設定を入れてみてはどうでしょうか。

$this->response->disableCache();

ブラウザキャッシュとの対話 - リクエストとレスポンスオブジェクト - 2.x

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/15 10:53

    なるほど、キュッシュは疑ってませんでした。
    頂いたコードをAppControllerで適用してしばらく検証してみます。
      ※chromeのデベロッパーツールにて、「cache-control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0」が出ているのを確認。

    キャンセル

  • 2020/05/26 13:05

    本番環境にアップロードして一週間様子をみましたが、再発しないようになっておりました。
    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る