Ejercicio 8. Configuración del componente Auth
Vamos a configurar el componente Auth de CakePHP en cinco pasos; es decir, en un plisplás. Este ejercicio supone que no hemos creado el modelo Usuario y su tabla correspondiente, así que lo haremos por el camino. Are you ready? Sí? 1, 2, 3… Go!
1. Copia el siguiente código.
function inicializarAuth(){ $this->Auth->userModel = 'Usuario'; $this->Auth->fields = array('username' => 'login', 'password' => 'password'); $this->Auth->loginAction = array('controller' => 'usuarios', 'action' => 'login'); $this->Auth->loginRedirect = array('controller' => 'usuarios', 'action' => 'index'); $this->Auth->logoutRedirect = array('controller' => 'pages', 'action' => 'display'); $this->Auth->loginError = 'El nombre de usuario y/o la contraseña no son correctos. Por favor, inténtalo otra vez'; $this->Auth->authError = 'Para entrar en la zona privada tienes que autenticarte'; $this->Auth->allow('registro'); $this->Auth->allow(array('display')); $this->Session->write('Auth.redirect', null); } // fin de function inicializarAuth function beforeFilter(){ $this->inicializarAuth(); } // fin de function beforeFilter()
2. Copia el archivo /cake/libs/controller/app_controller.php en /app/app_controller.php. Ahora, edita el recién creado /app/app_controller.php y pega el código que has copiado antes en el interior de la clase AppController. Cuando tu clase AppController quede como la del siguiente ejemplo, guárdala sin miedo. Date prisa.
class AppController extends Controller { var $components = array('Auth'); function inicializarAuth(){ $this->Auth->userModel = 'Usuario'; $this->Auth->fields = array('username' => 'login', 'password' => 'password'); $this->Auth->loginAction = array('controller' => 'usuarios', 'action' => 'login'); $this->Auth->loginRedirect = array('controller' => 'usuarios', 'action' => 'index'); $this->Auth->logoutRedirect = array('controller' => 'pages', 'action' => 'display'); $this->Auth->loginError = 'El nombre de usuario y/o la contraseña no son correctos. Por favor, inténtalo otra vez'; $this->Auth->authError = 'Para entrar en la zona privada tienes que autenticarte'; $this->Auth->allow('registro'); $this->Auth->allow(array('display')); $this->Session->write('Auth.redirect', null); } // fin de function inicializarAuth function beforeFilter(){ $this->inicializarAuth(); } // fin de function beforeFilter() }
3. Ahora tenemos que crear el modelo Usuario. Para ello, ve a /app/models y crea el archivo usuario.php con el siguiente código. ¡Corre!
class Usuario extends AppModel{ var $name = 'Usuario'; var $validate = array( 'login' => array( 'rule' => array('minLength', 1), 'required' => true, 'allowEmpty' => false, 'message' => 'Por favor, introduce el login' ), 'password' => array( 'rule' => array('minLength', 1), 'required' => true, 'allowEmpty' => false, 'message' => 'Por favor, introduce la contraseña' ), 'email' => array( 'rule' => 'email', 'required' => true, 'allowEmpty' => false, 'message' => 'Por favor, introduce una dirección de correo válida' ) ); }
4. Una vez tenemos el modelo Usuario, escribimos el SQL que crea usuarios, su tabla correspondiente. ¡Ya casi está!
create table usuarios( id mediumint unsigned NOT NULL auto_increment, login varchar(20) NOT NULL, email varchar(100) NOT NULL, data datetime NOT NULL, password varchar(40) NOT NULL, primary key(id) );
5. Finalmente, como estamos hechos unos campeones, nos tomamos un kit kat.
Qué hemos hecho?
Working like a machine? Muy buenas de nuevo, hemos vuelto de la publicidad y ahora es el momento de ver qué hemos hecho exactamente.
Paso 1
Aquí sólo hemos copiado un trozo de código; luego veremos qué hace exactamente. De momento, empero, vamos a intentar desentrañarlo un poco.
Los componentes de CakePHP encapsulan lógica que van a compartir varios controladores. En particular, Cake viene de fábrica con el componente Auth, cuya razón de ser es autenticar a los usuarios de una aplicación CakePHP. Como veremos un poquito más adelante en esta explicación, cuando añadimos el componente Auth al programa, entonces, de forma predeterminada, se bloquean todas las acciones a excepción de login y logout.
Paso 2
Todos los controladores de la aplicación Cake extienden la clase AppController; en consecuencia, si queremos añadir algo que compartan todos ellos, debemos hacerlo aquí. Por eso, estimado visitante, primero nos hemos ido a /cake/libs/controller/app_controller.php, luego hemos copiado este archivo en /app/app_controller.php, y, finalmente, hemos pegado el código aquí. ¿Quieres saber por qué es necesaria esta copia de app_controller.php? 😉 Haz clic aquí, pues.
En efecto, querido Watson, en AppController hemos añadido el componente Auth y lo hemos configurado en el método beforeFilter(). Por cierto, recordemos que beforeFilter() es una acción callback que se ejecuta justo antes de llamar a cualquier acción del programa CakePHP. Elemental. Bueno, visitante, en realidad bromeo un poco 😉 y puede que esto no sea tan elemental. Puedes echar un vistazo a las retrollamadas en http://book.cakephp.org/es/view/60/Callbacks.
Sin embargo, la dificultad de este paso número dos se encuentra en la función inicializarAuth porque es aquí donde debemos definir las propiedades del componente y esto implica que las conocemos. Quiero decir, que para escribir esta función tenemos que conocer un poco a Auth para decirle lo que queremos hacer con él. Vamos a hacerlo ahora.
Por defecto, la tabla donde se almacenan los usuarios se llama users, pero no siempre es así. Si quieres utilizar otra configuración puedes utilitzar los pasos 3 y 4 de este ejercicio, ¡pero recuerda decírselo a Auth en el beforeFilter! Por ejemplo, para utilizar el modelo Usuario, escribimos esto:
$this->Auth->userModel = 'Usuario';
Por otra parte, Auth espera que los campos que almacenan el nombre de usuario y la constraseña se llamen username y password y para decirle, «Oye, por favor, Auth, fíjate que, en vez de username y password, mi tabla usuarios tiene los campos login y password. Gracias», escribimos esta línea:
$this->Auth->fields = array('username' => 'login', 'password' => 'password');
Esta línea le dice a Auth dónde está la acción que autentica a los usuarios:
$this->Auth->loginAction = array('controller'=>'usuarios','action'=>'login');
Y esta otra, dónde debe redireccionar a los usuarios que salen correctamente del sistema:
$this->Auth->logoutRedirect = array('controller'=>'pages', 'action'=>'display');
Estas dos tienes que adivinarlas tú:
$this->Auth->loginError('El nombre de usuario y/o la contraseña no son correctos. Por favor, inténtalo otra vez'; $this->Auth->authError('Para entrar en la zona privada tienes que autenticarte');
¿Recuerdas que decíamos que cuando añadimos el componente Auth en AppController se bloquean todas las acciones a excepción de login y logout? Pues bien, si nos interesa desbloquear otras acciones para hacerlas accesibles a todos los visitantes del sitio web, entonces utilizamos la variable allow. Un caso típico es el de la acción que permite que los usuarios se puedan registrar. Efectivamente, si queremos que todo el mundo pueda acceder, entonces escribimos esto:
$this->Auth->allow('registro');
Si queremos que la vista /app/views/pages/home.ctp también esté disponible, escribimos:
$this->Auth->allow(array('display'));
Auth se comporta de forma que recuerda y redirecciona al URL al que el usuario intentaba acceder antes de entrar correctamente en el sistema. Por ejemplo, si el usuario escribe http://www.miaplicacioncakephp.com, y, a continuación, entra en http://www.miaplicacióncakephp.com/usuarios/login y se autentica, Auth no le envía a la vista login.ctp, como muchos podríamos esperar, sino a index.ctp. Esta dirección se guarda en la variable de sesión Auth.redirect; para deshabilitar este comportamiento, escribimos esto (hay una discusión interesante al respecto en http://book.cakephp.org/comments/index/392):
$this->Session->write('Auth.redirect',null);
Pasos 3 y 4
En estos pasos hemos creado el modelo Usuario y la tabla usuarios porque en este ejemplo no nos interesa seguir las convenciones de CakePHP y utilizar el modelo User y su tabla correspondiente, users. Finalmente, recordamos otra vez que, haciendo esto, es necesario comunícarselo a Auth; en concreto, como hemos visto, esto se hace a través de las variables userModel y fields.
Resumen
En este post hemos visto que los controladores de CakePHP extienden la clase AppController y que si queremos que una lógica determinada esté disponible en todos los controladores de la aplicación entonces debemos añadirla a la clase /app/app_controller.php.
CakePHP viene de fábrica con el componente Auth, y cuando lo añadimos en AppController se bloquean todas las acciones de todos los controladores a excepción de login y logout.
Para configurar Auth debemos conocer los parámetros de que dispone: userModel, fields, loginAction, allow, etc. En cualquier caso, todos ellos se parametrizan enel método beforeFilter de AppController porque esta acción se ejecuta antes de cualquier acción de la aplicación CakePHP.
Nota:
Ha pasado un tiempo desde que escribí en este blog el post https://tutorialcakephp.wordpress.com/2008/11/20/20-de-noviembre-de-2008-de-cakephp-11-a-cakephp-12-el-baile-de-los-errores-parte-ii/. Aquí explicaba mi primer acercamiento al componente Auth. ¡Espero que este otro lo encuentres un poco mejor y te sea más útil!
Filed under: Ejercicios y ejemplos Cake PHP | 5 Comments »