AnNaMaLaI
AnNaMaLaI

Reputation: 4084

cakephp 2.0 how to update auth data?

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

Upvotes: 14

Views: 13644

Answers (7)

Jon
Jon

Reputation: 840

CakePHP 4 answer: -

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

Where fullname is to be replaced by the user entity's field-name you have changed.

There may be a better way, but this is what I found after a lot of playing (and at this moment CakePHP 4 API has yet to be published https://api.cakephp.org/4.0/)

Upvotes: 0

Viviane Tolomeotti
Viviane Tolomeotti

Reputation: 13

I think that the simpler way to do this is:

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

Upvotes: 0

Tomas Gonzalez
Tomas Gonzalez

Reputation: 1175

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 :)

Upvotes: 0

func0der
func0der

Reputation: 2232

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' => '[email protected]'
    )
);

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

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

Upvotes: 5

monsur.hoq
monsur.hoq

Reputation: 1131

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

Upvotes: 0

AnNaMaLaI
AnNaMaLaI

Reputation: 4084

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

Upvotes: 25

Everton Yoshitani
Everton Yoshitani

Reputation: 946

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.

Upvotes: 8

Related Questions