cakephp 2.0 how to update auth data?

2019-03-09 16:00发布

问题:

when I update data in the User model, the Auth data is not updated.

How can I "refresh" the data which is returned by $this->Auth->user() when I am updating user model ?

and I don't want to use

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

after updating my user table

回答1:

I tried the following line. Its works well form me After modify the user data i written the following line

 $this->Session->write('Auth', $this->User->read(null, $this->Auth->User('id')));


回答2:

Write the updated data to the Session eg:

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

Before CakePHP 2.x you can't do this in the model without break the framework design.

With CakePHP 2.x you can load the Session Component from models and update it.



回答3:

evert0ns answer is right. But you should use AuthComponent::login(), because the data is saved within the AuthComponent as well and is not fetched from the session every time.

I had the problem just a couple of days ago.

// 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);
    }

Source: my paste

Put this in your AppController. The method is specialized to merge the current and the new user data to keep existing custom indexes that you may have provided. I needed this, but you can leave it out though. Give the updated user data as a parameter to the method. Not in model find form. E.g.:

$data = array(
    'User' => array(
        'username' => 'bla',
        'passwort' => 'fu',
        'email' => 'hu@bar.com'
    )
);

// Wrong
$this->renewUserSession($data);

// Right
$this->renewUserSession($data['User']);


回答4:

I solved this problem using afterSave function in User Model. It's working fine if we update user model from any area. My code was as below :

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;
    }
    ... ... ...
}


回答5:

I think func0der's answer is good, but it may be improved:

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);
    }
}

You can add this to your AppController.php and use it from any controller after modifying the logged in user.

I believe it's much cleaner and even though it implies access to the database, I think it's not going to be executed often enough to be an issue.

You should ALWAYS try to do things the "Cake" way. And avoid shortcuts like editing a session variable. It'll make things easier for you on the long run.

Please comment and add your opinions :)



回答6:

I think that the simpler way to do this is:

$user = $this->Auth->user();
$user['attribute'] = $newValue;
$this->Auth->setUser($user);