ユーザーモデルのデータを更新すると、認証データが更新されません。
ユーザーモデルを更新するときに$this->Auth-> user()によって返されるデータを「更新」するにはどうすればよいですか?
使いたくない
$ this-> Auth-> login($ data);
ユーザーテーブルを更新した後
ユーザーモデルのデータを更新すると、認証データが更新されません。
ユーザーモデルを更新するときに$this->Auth-> user()によって返されるデータを「更新」するにはどうすればよいですか?
使いたくない
$ this-> Auth-> login($ data);
ユーザーテーブルを更新した後
次の行を試してみました。それは私からうまく機能しますユーザーデータを変更した後、私は次の行を書きました
$this->Session->write('Auth', $this->User->read(null, $this->Auth->User('id')));
更新されたデータをセッションに書き込みます。例:
$this->Session->write('Auth.User', $data);
CakePHP 2.xより前では、フレームワークの設計を壊さずにモデルでこれを行うことはできません。
CakePHP 2.xを使用すると、モデルからセッションコンポーネントをロードして更新できます。
evert0nsの答えは正しいです。ただし、データはAuthComponent内にも保存され、毎回セッションからフェッチされるわけではないため、AuthComponent :: login()を使用する必要があります。
ほんの数日前に問題が発生しました。
// AppController.php
/**
* Renews current user data, e.g. in case of an email address change while being logged in.
*
* @param array $newUserData
* @return void
*/
protected function renewUserSession($newUserData){
if(!isset($newUserData) || empty($newUserData)){
return;
}
// We need to fetch the current user data so custom indexes are copied
$currentUserData = $this->Auth->user();
if(!isset($currentUserData) || empty($currentUserData)){
return;
}
// Merge old with new data
$newUserData = array_merge($currentUserData, $newUserData);
// Login with new data
$this->Auth->login($newUserData);
}
ソース:私のペースト
これをAppControllerに入れます。このメソッドは、現在のユーザーデータと新しいユーザーデータをマージして、提供した既存のカスタムインデックスを保持することに特化しています。私はこれが必要でしたが、あなたはそれを省くことができます。更新されたユーザーデータをパラメーターとしてメソッドに指定します。モデル検索形式ではありません。例えば:
$data = array(
'User' => array(
'username' => 'bla',
'passwort' => 'fu',
'email' => 'hu@bar.com'
)
);
// Wrong
$this->renewUserSession($data);
// Right
$this->renewUserSession($data['User']);
モデルafterSave
の関数を使用してこの問題を解決しました。User
任意の領域からユーザーモデルを更新すると、正常に機能します。私のコードは以下の通りです:
class User extends AppModel {
... ... ...
public function afterSave($created, $options = array()){
parent::afterSave($created,$options);
//updating authentication session
App::uses('CakeSession', 'Model/Datasource');
CakeSession::write('Auth',$this->findById(AuthComponent::user('id')));
return true;
}
... ... ...
}
func0derの答えは良いと思いますが、改善される可能性があります。
protected function renewLogin() {
if(!empty($this->Auth->user())) {
$this->loadModel('User');
$this->User->contain(false);
$user = $this->User->read(null, $this->Auth->user('id'))['User'];
unset($user['password']);
$this->Auth->login($user);
}
}
これをAppController.phpに追加し、ログインしたユーザーを変更した後、任意のコントローラーから使用できます。
これははるかにクリーンで、データベースへのアクセスを意味しますが、問題になるほど頻繁に実行されることはないと思います。
あなたは常に「ケーキ」の方法で物事をやろうとするべきです。また、セッション変数の編集などのショートカットは避けてください。長期的には、物事が簡単になります。
コメントしてあなたの意見を追加してください:)
これを行うためのより簡単な方法は次のとおりだと思います。
$user = $this->Auth->user();
$user['attribute'] = $newValue;
$this->Auth->setUser($user);
CakePHP 4の答え:-
$this->Authentication->getResult()->getData()->offsetSet('fullname', $user->fullname);
fullname
変更したユーザーエンティティのフィールド名に置き換えられる場所。
より良い方法があるかもしれませんが、これは私がたくさん遊んだ後に見つけたものです(そして現時点ではCakePHP 4 APIはまだ公開されていませんhttps://api.cakephp.org/4.0/)