2012-11-18 12 views
14

Po zaktualizowaniu danych w modelu użytkownika dane Auth nie są aktualizowane.cakephp 2.0 jak zaktualizować dane auth?

Jak mogę "odświeżyć" dane zwracane przez $ this-> Auth-> user(), gdy aktualizuję model użytkownika?

i nie chcę używać

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

po aktualizacji mój stół użytkownik

Odpowiedz

24

Próbowałem następującej linii. Jego prace tworzą dobrze mi Po modyfikować dane użytkownika i napisany następujący wiersz

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

Nie powinieneś próbować pracować z Komponentem Auth. Gdyby zmieniono klucze sesji, rozwiązanie natychmiast. – func0der

+0

Down-vote, ponieważ prawidłowy sposób to zrobić za pomocą czegoś takiego: '$ this-> Auth-> login ($ newUserData); Patrz odpowiedź func0der. –

+0

To jest coś takiego jak Znowu trzeba uwierzytelnić użytkownika, już użytkownik jest zalogowany Tak jest to zalecany sposób proszę dać mi znać @deceze [~ deceze] – AnNaMaLaI

7

Napisz zaktualizowanych danych do np Session:

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

Przed CakePHP 2.x nie można tego zrobić w modelu bez rozbić konstrukcję ramową .

Z CakePHP 2.x możesz wczytać komponent sesji z modeli i zaktualizować go.

+1

chciałbym uzyskać komentarz od użytkownika, który głosował ten dół. Dlaczego nie dostarczyć żadnych opinii. –

+0

Nie zrobiłem tego, ale jest to ta sama odpowiedź, którą dałem @ Annamalai.Somasundaram tutaj: http://stackoverflow.com/questions/13440820/cakephp-2-0-how-to-update-auth- data/13443607 # comment63042801_13559136 – func0der

5

Odpowiedź evert0ns jest prawidłowa. Ale powinieneś użyć AuthComponent :: login(), ponieważ dane są również zapisywane w AuthComponent i nie są pobierane z sesji za każdym razem.

Miałem problem zaledwie kilka dni temu.

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

Źródło: my paste

umieścić to w swoim AppController. Ta metoda specjalizuje się w łączeniu bieżących i nowych danych użytkownika, aby zachować istniejące niestandardowe indeksy, które można udostępnić. Potrzebowałem tego, ale możesz to pominąć. Podaj zaktualizowane dane użytkownika jako parametr metody. Nie w formularzu wyszukiwania modelu. Np .:

$data = array(
    'User' => array(
     'username' => 'bla', 
     'passwort' => 'fu', 
     'email' => '[email protected]' 
    ) 
); 

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

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

'array_merge()' powinno być główną atrakcją. – Fr0zenFyr

+0

@ Fr0zenFyr Nie dostaję tego, czego ode mnie chcesz. ^^ – func0der

+0

Nie chcę niczego, po prostu wskazywałem, że 'array_merge()' używane do łączenia rzeczywistej sesji i nowych wartości jest bohaterem twojego rozwiązania, aby uniknąć nadpisania czegokolwiek. Twoje zdrowie! – Fr0zenFyr

0

I rozwiązać ten problem przy użyciu afterSave funkcję w User Model. Działa to dobrze, jeśli zaktualizujemy model użytkownika z dowolnego obszaru. Mój kod był jak poniżej:

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

Co zrobić, jeśli model użytkownika został zmodyfikowany z sesji przeglądarki? jak w skrypcie powłoki lub cronjob? –

+1

Zobacz komentarz do odpowiedzi @ Annamalai.Somasundaram. Nie modyfikuj bezpośrednio sesji. – func0der

0

myślę odpowiedź func0der jest dobra, ale może być ulepszona:

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

Można dodać do swojej AppController.php i używać go z dowolnego kontrolera po zmodyfikowaniu zalogowany użytkownik.

Uważam, że jest to o wiele czystsze i mimo że wiąże się z dostępem do bazy danych, myślę, że nie będzie on wykonywany wystarczająco często, aby stanowić problem.

Powinieneś ZAWSZE próbować robić rzeczy w stylu "Ciasto". I unikaj skrótów, takich jak edycja zmiennej sesji. Ułatwi ci to na dłuższą metę.

Proszę o komentarz i dodaj swoją opinie :)

0

myślę, że prostszym sposobem na to jest:

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

To nie jest 2.x! – mark

Powiązane problemy