2012-11-18 9 views
14

Wenn ich Daten im Benutzermodell aktualisiere, werden die Auth-Daten nicht aktualisiert.cakephp 2.0 Wie update auth Daten?

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

und ich will nicht

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

nach meiner Benutzertabelle

Antwort

24

habe ich versucht, die folgende Zeile. Seine Werke mich gut bilden Nach ändern die Benutzerdaten i

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

Du solltest nicht versuchen, die Auth-Komponente zu umgehen. Wenn die Sitzungsschlüssel dort geändert würden, wäre Ihre Lösung sofort. – func0der

+0

Down-vote, weil der richtige Weg dies mit etwas wie: '$ this-> Auth-> login ($ newUserData);' Siehe Funcoder Antwort. –

+0

Seine einige Sache wie Again muss den Benutzer authentifizieren, bereits der Benutzer ist eingeloggt So ist dies die empfohlene Möglichkeit, lassen Sie es mich bitte @deceze [~ deceze] – AnNaMaLaI

7

Schreiben Sie die aktualisierten Daten an die Session zB Aktualisierung:

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

Bevor CakePHP 2.x können Sie dies im Modell nicht tun, ohne das Rahmen-Design brechen .

Mit CakePHP 2.x können Sie die Sitzungskomponente von Modellen laden und aktualisieren.

+1

Ich möchte einen Kommentar vom Benutzer erhalten, die nach unten diese gestimmt. Warum nicht ein Feedback geben? –

+0

Ich habe es nicht getan, aber es ist die gleiche Antwort, die ich @Annamalai.Somasundaram hier gegeben habe: http://StackOverflow.com/Questions/13440820/cakephp-2-0-how-to-update-auth- data/13443607 # comment63042801_13559136 – func0der

5

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: my paste

Setzen Sie diese in Ihrem 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' => '[email protected]' 
    ) 
); 

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

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

'array_merge()' sollte das Highlight sein. – Fr0zenFyr

+0

@ Fr0zenFyr Ich bekomme hier nicht ganz was du willst. ^^ – func0der

+0

Ich will nichts, hat nur darauf hingewiesen, dass 'array_merge()' verwendet, um tatsächliche Sitzung und neue Werte zu kombinieren, der Held Ihrer Lösung ist, um nichts zu überschreiben. Prost! – Fr0zenFyr

0

Ich löste dieses Problem mit afterSave Funktion in User Modell die folgende Zeile geschrieben. 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; 
    } 
    ... ... ... 
} 
+1

Was passiert, wenn das Benutzermodell aus der Browsersitzung geändert wurde? wie in einem Shell-Skript oder Cronjob? –

+1

Siehe Kommentar zu @ Annamalai.Somasundaram Antwort. Ändern Sie die Sitzung nicht direkt. – func0der

0

Ich denke func0der Antwort ist gut, aber es verbessert werden kann:

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 diese zu Ihrem AppController.php und es von jedem Controller verwenden hinzufügen können nach der Änderung der angemeldete Benutzer.

Ich glaube, es ist viel sauberer und obwohl es den Zugriff auf die Datenbank impliziert, denke ich, es wird nicht oft genug ausgeführt werden, um ein Problem zu sein.

Sie sollten IMMER versuchen, Dinge auf die Art und Weise "Kuchen" zu tun. Vermeiden Sie Verknüpfungen wie das Bearbeiten einer Sitzungsvariablen. Es wird dir die Dinge auf lange Sicht erleichtern.

Bitte kommentieren und fügen Sie Ihre Meinungen :)

0

Ich denke, dass die einfachere Art und Weise, dies zu tun ist:

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

Dies ist nicht 2.x! – mark