dimecres, 2 de setembre del 2009

AuthComponent: Actualitzar la sessió de l'usuari

Ben tornat de les vacances, ja torno a ser aquí per anar deixant cosetes que em semblin interessants. I com no, continuem amb el framework CakePHP.
CakePHP incorpora entre els seus components el component Auth, que si ho desitgem s'encarrega de la identificació d'usuaris de manera fàcil i ràpida. Fins ara només l'havia utilitzat en una aplicació web ja que el component es va incorporar amb la versió 1.2 i les altres aplicacions on havia requerit d'identificació van començar a desenvolupar-se amb la versió 1.1 i utilitzant altres components semblants que feien la mateixa funció i que he conservat encara que les hagi adaptat a noves versions.
Doncs bé, el fet és que m'he trobat amb un petit problema editant la informació d'un usuari que ja havia iniciat sessió a l'aplicació. Si tenim un escenari semblant a:
  • Un usuari s'ha identificat a l'aplicació amb Auth, de manera que tenim les seves dades accessibles mitjançant $this->Auth->read();
  • Les dades són accessibles ràpidament i sense accedir a la BD ja que estan guardades a la sessió.
  • Utilitzem les dades de l'usuari donades per Auth per mostrar certa informació. En el cas que m'ocupa, si l'usuari no està actiu (no ha confirmat encara el seu e-mail), se li mostra un missatge requerint aquesta acció.
  • Si les dades del model es modifiquen, la informació ha de canviar. En el meu exemple, si l'usuari activa el seu compte, s'ha de deixar de mostrar el missatge.
El problema sorgeix quan al canviar les dades del model Usuari, la informació a la sessió segueix inalterable i per tant, és errònia.
La solució passa per modificar la sessió amb les noves dades. He creat una funció que podeu posar al vostre usuaris_controller.php que s'encarrega de fer-ho.
private function _updateDataSession($newdata) {
    $updatedAuth = Set::merge(
        $this->Session->read(sprintf('Auth.%s',$this->Auth->userModel)),
        $newdata
    );
    $this->Session->write(sprintf('Auth.%s', $this->Auth->userModel), $updatedAuth);
}
De manera que des de qualsevol punt del controlador podeu modificar les dades de l'usuari en sessió:

function edit($id = null) {
   [...]
   if ($this->Usuari->save($this->data)) {
     [...]
     $this->_updateDataSession($this->data[$this->Auth->userModel]);
   }
}

function activa($id, $clauActivacio) {
  if ($this->Usuari->saveField('actiu', 1, false)) {
     $this->_updateDataSession(array('actiu'=>1));
  [...]
}

Com a mínim, la funció d'edició segurament apareixerà en la majoria d'aplicacions que facin un mínim ús dels usuaris, així que ja sabeu una manera de resoldre el problema.

1 comentari:

Arnau ha dit...

Sino també hi ha la opció de demanar a l'usuari que fiqui el DNI per la disquetera no?