14

当我更新用户模型中的数据时,身份验证数据不会更新。

更新用户模型时,如何“刷新” $this->Auth->user() 返回的数据?

我不想使用

$this->Auth->login($data);

更新我的用户表后

4

7 回答 7

25

我尝试了以下行。它对我来说效果很好修改用户数据后,我写了以下行

 $this->Session->write('Auth', $this->User->read(null, $this->Auth->User('id')));
于 2012-11-26T05:28:57.410 回答
8

将更新的数据写入 Session 例如:

$this->Session->write('Auth.User', $data);

在 CakePHP 2.x 之前,你不能在模型中这样做而不破坏框架设计。

使用 CakePHP 2.x,您可以从模型中加载会话组件并对其进行更新。

于 2012-11-18T14:54:40.647 回答
5

evert0ns 的答案是正确的。但是您应该使用 AuthComponent::login(),因为数据也保存在 AuthComponent 中,并且不会每次都从会话中获取。

几天前我遇到了这个问题。

// 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']);
于 2012-11-18T19:16:00.840 回答
0

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;
    }
    ... ... ...
}
于 2014-03-08T16:47:27.020 回答
0

CakePHP 4答案:-

$this->Authentication->getResult()->getData()->offsetSet('fullname', $user->fullname);

wherefullname将替换为您已更改的用户实体的字段名称。

可能有更好的方法,但这是我玩了很多之后发现的(此时 CakePHP 4 API 尚未发布https://api.cakephp.org/4.0/

于 2020-04-21T09:03:38.697 回答
0

我认为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 并在修改登录用户后从任何控制器使用它。

我相信它更干净,即使它意味着对数据库的访问,我认为它不会经常执行到足以成为问题的地步。

您应该始终尝试以“蛋糕”的方式做事。并避免使用诸如编辑会话变量之类的快捷方式。从长远来看,它会让你的事情变得更容易。

请发表评论并添加您的意见:)

于 2016-06-19T04:19:07.693 回答
0

我认为更简单的方法是:

$user = $this->Auth->user();
$user['attribute'] = $newValue;
$this->Auth->setUser($user);
于 2017-06-29T18:56:53.387 回答