En este post vamos a configurar el Plugin Users de la gente de CakeDC en una aplicación desarrollada con CakePHP 2.x. Vamos a empezar.
¿Que es el Plugin Users?
Es un plugin para CakePHP desarrollado por la gente de CakeDC para el registro, login, logout y más de usuarios. Este plugin por si mismo es capaz de:
- Registro de usuarios (Habilitado por defecto)
- Verificación de registro por token enviado vía email
- Login de usuarios (email/password)
- Reseteo de password basado en token vía email e ingresando nuevo password
- Perfil de usuario simple
- Búsqueda de usuarios (requiere CakeDC Search Plugin)
- Gestión de usuarios usando la seccion "admin" (add/edit/delete)
- Gestión de Roles simple
Por defecto para el reseteo de password se requiere que el usuario ingrese su dirección de email, se le envía un mail con un link y token. Cuando accede a la URL con el token el usuario podrá ingresar un nuevo password.
Comenzamos
Nota: Vamos a suponer que ya tenemos instalado CakePHP 2.x en nuestro servidor con la base de datos configurada, para este tutorial hemos usado la version 2.5.1. Si todavia no
lo teneis instalado podeis instalarlo desde aqui siguiendo los pasos desde la documentación oficial de CakePHP.
El plugin CakeDC Users requiere PHP5.2+, CakePHP 2.x, plugin CakeDC Search y plugin CakeDC Utils.
1. Instalamos el Plugin Users
Para instalar el plugin solo teneis que descargarlo desde Github y descomprimirlo en una carpeta llamada Users en la siguiente ruta de vuestra aplicación /project_name/app/Plugin/Users, aquí os dejo el enlace
O de forma alternativa si usais Git podeis teclear el siguiente comando:
git submodule add git@github.com:CakeDC/Users app/Plugin/Users
Para que este plugin fucione es necesario instalar otro dos plugin de la gente de CakeDC. Estos son el plugin Search y el plugin Utils
seguiremos el mismo procedimiento, los descargamos y los descomprimimos en las siguientes rutas respectivamente /project_name/app/Plugin/Search y /project_name/app/Plugin/Utils
Si preferis hacerlo con git tecleamos los siguientes comandos.
Para el plugin Search
git submodule add git@github.com:CakeDC/Search app/Plugin/Search
Para el plugin Utils
git submodule add git@github.com:CakeDC/Utils app/Plugin/Utils
2. Crando las tablas en la Base de Datos
Esto los podemos hacer de dos formas, desde la consola de CakePHP o simplemete utilizando phpMyAdmin y ejecunatdo la siguiente secuencia SQL
CREATE TABLE IF NOT EXISTS `users` (
`id` varchar(36) COLLATE utf8_spanish_ci NOT NULL,
`username` varchar(255) COLLATE utf8_spanish_ci NOT NULL,
`slug` varchar(255) COLLATE utf8_spanish_ci NOT NULL,
`password` varchar(128) COLLATE utf8_spanish_ci DEFAULT NULL,
`password_token` varchar(128) COLLATE utf8_spanish_ci DEFAULT NULL,
`email` varchar(255) COLLATE utf8_spanish_ci DEFAULT NULL,
`email_verified` tinyint(1) DEFAULT '0',
`email_token` varchar(255) COLLATE utf8_spanish_ci DEFAULT NULL,
`email_token_expires` datetime DEFAULT NULL,
`tos` tinyint(1) DEFAULT '0',
`active` tinyint(1) DEFAULT '0',
`last_login` datetime DEFAULT NULL,
`last_action` datetime DEFAULT NULL,
`is_admin` tinyint(1) DEFAULT '0',
`role` varchar(255) COLLATE utf8_spanish_ci DEFAULT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `BY_USERNAME` (`username`),
KEY `BY_EMAIL` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
CREATE TABLE IF NOT EXISTS `user_details` (
`id` varchar(36) COLLATE utf8_spanish_ci NOT NULL,
`user_id` varchar(36) COLLATE utf8_spanish_ci NOT NULL,
`position` float NOT NULL DEFAULT '1',
`field` varchar(255) COLLATE utf8_spanish_ci NOT NULL,
`value` text COLLATE utf8_spanish_ci,
`input` varchar(16) COLLATE utf8_spanish_ci NOT NULL,
`data_type` varchar(16) COLLATE utf8_spanish_ci NOT NULL,
`label` varchar(128) COLLATE utf8_spanish_ci NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQUE_PROFILE_PROPERTY` (`field`,`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
Si decidimos hacerlo con la consola tenemos que teclear el siguiente comando:
./Console/cake schema create users --plugin Users
3. Cargando el Plugin Users y las Rutas
Ahora tenemos que cargar nuestro Plugin Users junto con los Plugin Utils y Search en nuestro CakePHP, para ello abrimos nuestro fichero boottstrap.php
ubicado en /project_name/app/Config/bootstrap.php y añadimos las siguientes lineas de codigo:
CakePlugin::load('Users' array('routes' => true));
CakePlugin::load('Search');
CakePlugin::load('Utils');
Cuando indicamos en la carga del plugin Users array('routes' => true) lo que estamos haciendo es cargar las rutas definidas para el plugin para
tener las pretty URL, es decir, http://localhost/project_name/users/login y no http://localhost/project_name/users/users/login
4. Accediendo a las acciones del Plugin
Una vez que tenemos todo configurado podemos acceder a las acciones de la siguiente manera:
- Login http://localhost/project_name/users/login o http://localhost/project_name/login
- Registro http://localhost/project_name/register o http://localhost/project_name/users/add
Esta seria la configuración básica del Plugin Users. Ahora vamos a ver como configurar algunas opciones más del plugin y como personalizarlo y adaptarlo a nuestras necesidades.
5. Configurando el Email para poder enviar correos.
Por defecto el Plugin Users utiliza la opción 'default' de nuestra configuración de email que se encuentra en /project_name/app/Config/email.php, si necesitamos especificar otra, por ejemplo gmail, tendriamos que añadir la siguiente linea a nuestro fichero bootstrap.php:
Configure::write('Users.emailConfig', 'gmail');
No olvideis declarar la variable $gmail con la configuración en vuestro fichero /project_name/app/Config/email.php.
Si queries saber como se configura CakePHP para enviar emails utilizando una cuenta de Gmail o una cuenta Smtp/Pop3 podeis revisar este post.
Para reescribir las plantillas para los Email hay que modificar los ficheros localizados en /project_name/app/Plugin/Users/View/Emails/txt
6. Utilizar la funcionalidad "Remember me".
Para habilitar esta funcionalidad tenemos que seguir los siguientes pasos (esto es muy bien explicado en la documetnacion del Plugin en Github simplemete voy a traducir lo que pone).
Primero abrimos nuestro AppController y añadimos el componente "User.RemeberMe" y el componente Auth (esto no esta indicado en la documentación pero es necesario añadirlo.
public $components = array(
'Users.RememberMe',
'Auth'
);
Ahora siguiendo en nuesto AppController declaramos el método beforeFilter y añadimos lo siguiente:
public function beforeFilter() {
parent::beforeFilter();
$this->RememberMe->restoreLoginFromCookie();
}
Con esto ya tendriamos la funcionalidad habilitada, el código lo que hace es leer las credenciales desde la cookie y logear al usuario segun estas.