今はわざわざ全てのfunctionで下記のようにuserテーブルを検索しなおしています。
$cond = $this->Auth->user('id');
$user = $this->User->findByid($cond);
これをfunction beforeFilter()で共通処理にしようとも考えましたが、$userが他のfunctionからは参照できませんでした。
(function間では変数を参照できない?)
認証テーブルのデータは頻繁に更新されるのでしょうか?
もし、認証情報が含まれたテーブルが頻繁に更新する必要があるのであれば、テーブルの設計自体を検討し直すのが一番しっくり来る気がします。
どうしても現状のままでということであれば、認証情報を含んだモデルが更新された時点で、ログアウトする仕様に変更する、あるいは、システム的に一度ログアウトしてログインする。
というのはいかがでしょうか?
こうすることで、authComponentがセッション中に保持している情報を更新すれば、とりあえずは期待する動作になるかと思いますが。
少なくとも、更新よりは参照の方が回数ははるかに多いと思うので、各アクセスごとに問い合わせるのはパフォーマンス的にもよくない気がします。
何かの参考になれば。
コメント(3件)
$data = array(
'User.username' => $user['User']['username'],
'User.password' => $user['User']['password']);
$this->Auth->logout();
$this->Auth->login($data);
beforeFilterのfunctionで処理した変数を、本来のfunctionに渡す方法についてはうまくいきません。
これって無理なんでしょうか。
$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からもそれを参照するようにするとよいかもしれません。
何かの参考になれば。
ありがとうございました。