dilluns, 14 de setembre del 2009

AutoLogin Component per a CakePHP

Els components CakePHP et poden facilitar enormement la vida en algunes tasques comunes en les aplicacions web. A més dels components inclosos al nucli de CakePHP, existeixen multitud de components "extra" que poden resultar molt útils -a mi m'ho han estat- i que aniré repassant a mesura que vagi tenint alguns moments.

Començaré per un de molt senzill que, no obstant, acaba sent molt pràctic quan es tracta amb usuaris en una aplicació web. Per aquest aspecte ja comptem amb el AuthComponent de CakePHP, inclòs al nucli i que gestiona l'autenticació d'usuaris. Però, i si volem afegir la opció de identificar-se automàticament (el típic, "recorda'm la pròxima vegada")? Doncs podem implementar-ho nosaltres mateixos utilitzant cookies o bé simplement utilitzar un component desenvolupat per Miles Johnson, l'AutoLogin Component.

En un tres i no res els nostres usuaris podran comptar amb la opció de visitar la nostra aplicació web i automàticament iniciar sessió amb el seu usuari. Tot amb una instal·lació molt fàcil i la possibilitat de configurar diferents aspectes com la durada de la cookie.

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.