Cakephp・AuthComponentでusersの値を取得する際の注意

初心者がCakephpをやる件で以前にAuthComponentを実装しました(参考:CakePHPのAuthComponent実装+ブラウザ閉じても認証保持)。
DBにusersテーブルを作成しusernameとpasswordフィールドがあれば、それを使用して簡単にユーザー認証が作れてしまいます。
さらにログイン後には、
$this->Auth->user('username');
で簡単にusersの特定の値を取得できます。
ただし1点、注意が必要なことがありました。
それはログイン後にusersテーブルをUPDATEした場合は、$this->Auth->user()で値を取得しても、それはログイン時点のものになります。
例えば「usersテーブルにあるnicknameフィールドを取得する」場合。
$this->Auth->user('nickname');
上記ではログイン後にnicknameを変更しても反映されません。
(ログイン後に「ようこそ○○さん」のような表示をしている場合、ニックネームを変更しても反映されずに「あれ?」となる)
回避方法は以下の2点。

1.ユーザー情報の取得は常にDBを検索する

//idをキーにしてusersテーブルを検索
$cond = $this->Auth->user('id');
$user = $this->User->findByid($cond);
$data = $user['User']['nickname'];

2.Usersを更新した場合は自動的にログアウト、ログインする

//usersテーブルのUPDATE
$this->User->save($this->data['User']);
//Authを再設定するためにログアウト->ログイン
$cond = $this->Auth->user('id');
$user = $this->User->findByid($cond);
$data = array(
'User.username' => $user['User']['username'],
'User.password' => $user['User']['password']);
$this->Auth->logout();//ログアウトして
$this->Auth->login($data);//再びログイン

一見、後者の方が煩雑ですが、usersのUPDATEが頻繁で無い場合は$this->Auth->user()でusersを取得する際に間違いがないです。
あとはusersテーブルは認証に関わる不変のものだけにして、頻繁に変更されるユーザー情報はuser_detailsなどにして別テーブルにするのがよいのかもしれない。

オマケ

自動ログインで下記のようにしたけど、パスワードは取得できなかった。
'User.username' => $this->Auth->user('username'),
'User.password' => $this->Auth->user('password'));

セキュリティ的な理由でsesseionに保持していないんだろうな。当たり前か。
参考
cakephpのAuthComponentは認証後に$this->Auth->user();でuser情報を取得できますが、ログイン中にuser情報がupdateされても反映されないようです。解決策はあるでしょうか.. – 人力検索はてな
(今回もはてなさんに頼りました)

コメント

  1. hiromi2424 より:

    実はAuthComponent::login($user_id)でログイン処理が通ります。ご参考までに。

  2. umakoya より:

    そんな方法があったのですが?
    (調べた当時はそんな情報に行き当たらなかった気が)
    情報をありがとうございました。

タイトルとURLをコピーしました