cakephpのAuthComponentは認証後に$this->Auth->user();でuser情報を取得できますが、ログイン中にuser情報がupdateされても反映されないようです。解決策はあるでしょうか?

今はわざわざ全てのfunctionで下記のようにuserテーブルを検索しなおしています。
$cond = $this->Auth->user('id');
$user = $this->User->findByid($cond);
これをfunction beforeFilter()で共通処理にしようとも考えましたが、$userが他のfunctionからは参照できませんでした。
(function間では変数を参照できない?)

回答の条件
  • 1人2回まで
  • 登録:2008/10/16 00:06:53
  • 終了:2008/10/21 19:53:59

ベストアンサー

id:t_shiono No.1

t_shiono回答回数256ベストアンサー獲得回数222008/10/16 00:50:26

ポイント60pt

認証テーブルのデータは頻繁に更新されるのでしょうか?

もし、認証情報が含まれたテーブルが頻繁に更新する必要があるのであれば、テーブルの設計自体を検討し直すのが一番しっくり来る気がします。

どうしても現状のままでということであれば、認証情報を含んだモデルが更新された時点で、ログアウトする仕様に変更する、あるいは、システム的に一度ログアウトしてログインする。

というのはいかがでしょうか?

こうすることで、authComponentがセッション中に保持している情報を更新すれば、とりあえずは期待する動作になるかと思いますが。


少なくとも、更新よりは参照の方が回数ははるかに多いと思うので、各アクセスごとに問い合わせるのはパフォーマンス的にもよくない気がします。

何かの参考になれば。

  • id:umakoya
    user情報の更新頻度はあまり高くないので、UPDATEする時だけログアウト→ログインの処理をしたらAuthの情報が更新されるようになりました。
    $data = array(
    'User.username' => $user['User']['username'],
    'User.password' => $user['User']['password']);
    $this->Auth->logout();
    $this->Auth->login($data);

    beforeFilterのfunctionで処理した変数を、本来のfunctionに渡す方法についてはうまくいきません。
    これって無理なんでしょうか。
  • id:t_shiono
    dispatcher.phpで定義されているDispatcherのdispach関数のソースを見れば分かりますが、

    $controller->Component->initialize($controller);
    $controller->beforeFilter();
    $controller->Component->startup($controller);
    return $this->_invoke($controller, $this->params, $missingAction);

    という処理になっています。
    authComponentはstartup()の中で認証情報を取得するので、コントローラーのbeforeFilter()で設定してもauthComponentのstartup()の処理の中で上書きされてしまいます。

    そのため、もしやるのであれば、セッション中の値を書き換えておけば、authComponent()のstartup()が期待する処理を詰め込んでくれるようになると思いますが、authComponentの実装が変わったときに動作する保障はなくなってしまいます。

    どうしてもAppControllerでやりたいのであれば、別なクラス変数をAppControllerに用意しておいて、それに格納して各派生Controllerからもそれを参照するようにするとよいかもしれません。


    何かの参考になれば。
  • id:umakoya
    たいへん参考になりました。Componentの方が後に処理されるのですね。
    ありがとうございました。

この質問への反応(ブックマークコメント)

トラックバック

  • AuthComponentでusersの値を取得する際の注意 陽のあたらない美術館 -人間再生- 2008-11-10 19:38:23
    初心者がCakephpをやる件で以前にAuthComponentを実装しました(参考:CakePHPのAuthComponent実装+ブラウザ閉じても認証保持)。DBにusersテーブルを作成しusernameとpasswordフィールドがあれば、それを
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません