Frage CakePHP 2.0 Wie aktualisiert man die Authentifizierungsdaten?


Wenn ich Daten im Benutzermodell aktualisiere, werden die Auth-Daten nicht aktualisiert.

Wie kann ich die Daten aktualisieren, die von $ this-> Auth-> user () zurückgegeben werden, wenn ich das Benutzermodell aktualisiere?

und ich möchte nicht verwenden

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

nach dem Aktualisieren meiner Benutzertabelle


14
2017-11-18 13:57


Ursprung


Antworten:


Ich habe die folgende Zeile ausprobiert. Es funktioniert gut von mir Nach dem Ändern der Benutzerdaten habe ich die folgende Zeile geschrieben

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

24
2017-11-26 05:28



Schreiben Sie die aktualisierten Daten in die Sitzung, zB:

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

Vor CakePHP 2.x können Sie dies nicht im Modell tun, ohne das Framework-Design zu unterbrechen.

Mit CakePHP 2.x können Sie die Session-Komponente aus Modellen laden und aktualisieren.


7
2017-11-18 14:54



Evert0ns Antwort ist richtig. Sie sollten jedoch AuthComponent :: login () verwenden, da die Daten auch in der AuthComponent gespeichert und nicht jedes Mal aus der Sitzung abgerufen werden.

Ich hatte das Problem vor ein paar Tagen.

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

Quelle: meine Paste

Setzen Sie dies in Ihren AppController. Die Methode ist darauf spezialisiert, die aktuellen und die neuen Benutzerdaten zusammenzuführen, um vorhandene benutzerdefinierte Indizes beizubehalten, die Sie möglicherweise bereitgestellt haben. Ich brauchte das, aber du kannst es trotzdem auslassen. Geben Sie die aktualisierten Benutzerdaten als Parameter für die Methode an. Nicht im Modell finden. Z.B.:

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

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

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

5
2017-11-18 19:16



Ich löste dieses Problem mit afterSave Funktion in User Modell. Es funktioniert gut, wenn wir das Benutzermodell aus einem beliebigen Bereich aktualisieren. Mein Code war wie folgt:

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
2018-03-08 16:47



Ich denke func0ders Antwort ist gut, aber es könnte verbessert werden:

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

Sie können dies zu Ihrer AppController.php hinzufügen und von jedem Controller aus verwenden, nachdem Sie den angemeldeten Benutzer geändert haben.

Ich glaube, es ist viel sauberer und obwohl es den Zugang zur Datenbank impliziert, denke ich, dass es nicht oft genug ausgeführt wird, um ein Problem zu sein.

Du solltest IMMER versuchen, Dinge auf "Kuchen" zu machen. Vermeiden Sie Verknüpfungen wie das Bearbeiten einer Sitzungsvariablen. Es wird dir die Dinge auf lange Sicht erleichtern.

Bitte kommentiere und füge deine Meinung hinzu :)


0
2018-06-19 04:19



Ich denke, dass der einfachere Weg dies zu tun ist:

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

0
2018-06-29 18:56