cakephp 2.0 how to update auth data?

后端 未结 7 1319
别那么骄傲
别那么骄傲 2021-02-01 08:12

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

相关标签:
7条回答
  • 2021-02-01 08:25

    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.

    0 讨论(0)
  • 2021-02-01 08:26

    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;
        }
        ... ... ...
    }
    
    0 讨论(0)
  • 2021-02-01 08:35

    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')));
    
    0 讨论(0)
  • 2021-02-01 08:46

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

    0 讨论(0)
  • 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']);
    
    0 讨论(0)
  • 2021-02-01 08:49

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

    0 讨论(0)
提交回复
热议问题