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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

2040閲覧

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

K.T_build

総合スコア29

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

1クリップ

投稿2020/05/13 06:35

編集2020/05/14 02:01

いつもお世話になっております。
社員向け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' // ) ));

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyoya0819

2020/05/13 06:37

ブラウザに保存されたログイン情報ということはありませんか?
K.T_build

2020/05/13 06:52

回答ありがとうございます。 AuthComponentの仕組みを利用しているのでそれ次第ということになります ※まだAuthがブラウザ側かサーバー側のどちらかに保存されるかはこれから調べてみないとわかりません、、、 ただ、ブラウザに保存されたログイン情報でも、同画面でF5を押すとたまにユーザーが切り替わるといった事態は起きないのではないかと思っています。
K.T_build

2020/05/13 06:55

(追記) SessionComponentを使っているようなのでサーバー側にログイン情報は保存されているようです。
nojimage

2020/05/13 12:26

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

2020/05/13 12:27

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

2020/05/14 02:02

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

回答1

0

ベストアンサー

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

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

php

1$this->response->disableCache();

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

投稿2020/05/14 05:20

編集2020/05/14 05:22
nojimage

総合スコア957

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K.T_build

2020/05/15 01:53

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

2020/05/26 04:05

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問