前にセッションの記事を書きましたが、それに関わる話
こういうこともあるんですね、という共有です
経緯
先週まで普通に動いてた管理画面にて、「ログインできないんですけど…」という作業者からの問い合わせがありました。
環境は
- cakephp2.4.10
- nginx
- php-fpm
現象
- cakephp2のAuthで構築したログイン画面にIDとパスを入れる
- その直後ログイン画面にリダイレクトされる
- 以降繰り返しでTOPに入れない
先に結論
原因はセッションファイルを読み込めていないことでした。
ログイン状態を記憶できてなかったのでこんな不思議現象が。。
下記は対応記録です。
対応記録
まずはログを確認
何も出てない。ということはつまりエラーではない。
急に発生したということでサーバーの環境が変わった方を疑いました。
ちなみにログ出力先の設定はデフォルトなのも確認しました。
ログイン処理が成功してるかどうか確認
public function login() {
$this->log("認証処理開始", LOG_DEBUG);
if ($this->request->is('post')) {
if ($this->Auth->login()) {
$this->log("ログイン成功", LOG_DEBUG);
$this->redirect($this->Auth->redirect());
} else {
$this->log("ログイン失敗", LOG_DEBUG);
$this->Session->setFlash(__('Invalid username or password, try again'));
}
}
}
こんなログを仕込んでみたところ、ちゃんと「成功」のログが。
ということでここまでは正常のようです。
(ついでにログの出力先も予想通りなので、やっぱりエラーは出てないようです。)
ログイン成功してるけどまたログインに飛ばされる、ということはもしかしてログイン状態が記憶されてない?
Authではそれをセッションで管理しているため、保存できてるか確認します。
セッションを保存できてるか確認
https://qiita.com/kazu56/items/a54596e963d9e2b71f2e
セッション保存できてるかどうかは$this->Auth->user()
を見ればいいようです。
AppControllerの先頭にログを仕込むと
2020-07-27 11:27:42 Debug: セッション保存のユーザー :
ということで空文字が出力されてます。やっぱり保存されてないっぽい
自分で適当に$Session['test']
を定義してみても同様
設定確認
https://inoccu.com/blog/2012/11/21/223145.html
cakephpでセッションをデフォルトで使うとファイルで管理されます。
ということで、このファイルにアクセスできてない説が濃厚。
core.phpの設定は
Configure::write('Session', array(
'defaults' => 'php',
'timeout' => 60,
));
クックブック見ると「phpの設定に準拠」とのことなのでphp.iniを確認
session.save_path => no value => no value
なんだって…orz
デフォルトのパスにもない…orz
保存パスを探して三千里
https://qiita.com/cranpun/items/02eaa615c523aac8f375
設定ファイルで上書きされてる可能性があるとのこと。
問題の環境はnginxですがphp-fpmも使ってるので上書きされてる可能性はありそう。
ただし設定ファイルはめちゃくちゃな数があり、探せど探せど見つからないので諦めました。
(どうせ今の設定だとアクセスできてないし)
cakeの設定を変えればいいじゃない
Configure::write('Session', array(
'defaults' => 'php',
'timeout' => 60,
));
を
Configure::write('Session', array(
'defaults' => 'cake',
'timeout' => 60,
));
に変えました。これでAPP/tmp/session
に保存されるようになります。
sessionフォルダを作って権限設定して解決!と思いきやまだダメでした。
cookie削除しなきゃダメですよ
セッションの同一性はcookieで判断されます。
よってダメだった時のcookieが残ってるとうまくいきません。
ということでブラウザのCookieを削除して確認するとやっと正常に動いてくれました。
原因推測
- 使ってるサーバーはNFSを使ってソースコードの共有をしていた
- そのノリでセッションファイルも共有していたのでは?という推測。
- そしてそこにアクセスできなくなったのが大元の原因では?という推測
古いシステムのため設定を知ってる人もいない+ドキュメントにも書いてないので迷宮入り…
仮に共有されてたとしても、このサーバーはELBを噛ませてるわけでもないので問題ないと判断しました。
教訓
- ログイン系に異常があったらセッション周りも疑う
- php.iniの設定は上書きされてることもある。
- 普通と違う設定使ってるならドキュメントを書きましょう(ブチギレ)