cakephp 2.0 Как обновить данные auth?

когда я обновляю данные в пользовательской модели, данные Auth не обновляются.

Как я могу "обновить" данные, которые возвращаются $this - >Auth - >user () при обновлении модели пользователя ?

и я не хочу использовать

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

после обновления моей таблицы пользователей

6 ответов


я попробовал следующую строку. Его работы хорошо формируют меня После изменения пользовательских данных я написал следующую строку

 $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:: 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']);

я решил эту проблему с помощью


Я думаю, что ответ 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);