Cakephp 2.0 как обновить данные auth? - программирование
Подтвердить что ты не робот

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

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

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

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

$this- > Auth- > для входа ($ данные);

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

4b9b3361

Ответ 1

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

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

Ответ 2

Запишите обновленные данные на сеанс, например:

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

Перед тем, как CakePHP 2.x вы не сможете сделать это в модели, не нарушая структуру фреймворка.

С CakePHP 2.x вы можете загрузить компонент сеанса из моделей и обновить его.

Ответ 3

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

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

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

Ответ 4

Я решил эту проблему, используя функцию afterSave в User Model. Он отлично работает, если мы обновляем модель пользователя из любой области. Мой код был следующим:

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

Я думаю, что ответ 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 и использовать его с любого контроллера после изменения зарегистрированного пользователя.

Я считаю, что это намного чище, и хотя это подразумевает доступ к базе данных, я думаю, что это не будет выполняться достаточно часто, чтобы быть проблемой.

Вы должны ВСЕГДА стараться делать вещи "торт". И избегайте ярлыков, таких как редактирование переменной сеанса. Это облегчит вам работу в долгосрочной перспективе.

Прокомментируйте и добавьте ваше мнение:)

Ответ 6

Я думаю, что более простой способ сделать это:

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