Como usar Zend_Auth del Zend Framework



Documentos relacionados
Manejo de datos BLOB con PHP y MySQL

XAJAX: una librería de AJAX para PHP (parte 1)

all: doctrine: class: sfdoctrinedatabase param: dsn: mysql:host=localhost;dbname= bdd_erhaj username: erhaj password: admin

PROYECTO MIS IMÁGENES,

Tabla de contenidos Saludo... 3 Instrucción inicial... 3 Vista... 3 Controlador... 3 Modelo... 3 Barra de direcciones... 4 Evitar el index.

Para subir archivos usando los datos que nos proporcionaron vía correo electrónico.

PHP: Interacción con HTML

Misión, Visión y Objetivos

*si tuvieron algún problema pueden verificar la documentación oficial Vamos a crear una BD llamada droid_login como lo muestra la siguiente imagen:

Servicio de Informática Vicerrectorado de Tecnologías de la Información y la Comunicación

INSTALACIÓN DE SIESTTA 2.0 EN UN HOSTING (Ejemplo para Guebs.com)

Tutorial Servicios Web

MODULO DE USUARIOS PARTE 1

Cómo gestionar menús en Drupal 7

CÓMO DESCARGAR E INSERTAR O INSTALAR PLUGINS O BOTONES DE FACEBOOK EN NUESTRA PÁGINA WEB: ME GUSTA. (DV00503A)

Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro

CÓMO CREAR NUESTRO CATÁLOGO

Partes del formulario

Formatos para prácticas de laboratorio

MANUAL DE USUARIO DEL SISTEMA PARA EL REDACTOR

GENERAR DOCUMENTOS HTML USANDO LENGUAJE PHP. EJERCICIO RESUELTO EJEMPLO SENCILLO. (CU00733B)

Comerciales. Comisiones en Documentos de Venta WhitePaper Enero de 2008

Manual de ayuda para la utilización del Correo Interno en el Campus Virtual

Squipy v Introducción

Word Interfaz Word 2007.

Carlos Alberto Alegría. Tutorial: realizar CRUD con Zend Framework para php. Entorno de Programación: Eclipse PHP. Servidor de prueba: Xampp.

MATERIAL 2 EXCEL 2007

CAPAS O CONTENEDORES EN HTML. ETIQUETAS DIV Y SPAN. EJEMPLOS. MAQUETAR O DAR ESTRUCTURA A LAS PÁGINAS WEB. (CU00726B)

Menús. Gestor de Menús

MANUAL DE USUARIO. Sistema de Administración de Proyectos de Vinculación con la Colectividad (SAPVC) MANUAL DE USUARIO DOCENTE

PHP Hypertext PreProcessor

Resumen del módulo EZ Web Lynx.

Guía de migración a firma HMAC SHA256 Conexión por Redirección

IDENTIFICACIÓN DE LA ACTIVIDAD PEDAGÓGICA

Modulo 1 El lenguaje Java

Manual de cgi . Sync-Intertainment

INSTALACIÓN DE ORACLE 8i (8.1.7) SOBRE NT

**NOTA** las partes tachadas todavía no están escritas, se ira actualizando poco a poco el documento

DUDAS DE ACCESO / PROBLEMAS DE ACCESO MÁS FRECUENTES

RECUPERAR DATOS DE UN FORMULARIO HTML USANDO PHP. USO DE $_GET. EJEMPLOS Y EJERCICIOS RESUELTOS. (CU00833B)

TUTORIAL DE INSTALACIÓN Y CONFIGURACIÓN SERVIDOR LOCAL (MYSQL) Facturar en Línea

Servicio de estadísticas de Alojamiento Fecha de revisión: 19/09/2005

IVOOX. 1º.-Subir y gestionar archivos.

BASES DE DATOS AVANZADAS Transacciones en MYSQL

Herramienta programación de placas KKmulticopter

CONSEJERÍA DE EDUCACIÓN SÉNECA MÓVIL. Manual de uso de la versión on line para el control de las ausencias del alumnado.

Como Crear Distro Personalizada

Primeros pasos para una configuración rápida de la tienda.

Proyectos de Innovación Docente

5- Uso de sentencias avanzadas

Manual de Listas de Correo MailMan. Sync-Intertainment

Plantilla de texto plano

INSTALACIÓN DE GATEWAYS SIP

UNIVERSIDAD NACIONAL EXPERIMENTAL POLITÉCNICA DE LA FUERZA ARMADA NACIONAL EXTENSIÓN BARQUISIMETO BARQUISIMETO ESTADO. LARA

CENTRO DE INVESTIGACIÓN CIENTÍFICA Y DE EDUCACIÓN SUPERIOR DE ENSENADA, BAJA CALIFORNIA Departamento de Cómputo / Dirección de Telemática ÍNDICE

NORMA (SEPA) 22/11/2013

Base de datos I Facultad de Ingeniería. Escuela de computación.

Gestión de usuarios en la web educativa del centro con JOOMLA!

SISTEMA ETAP en línea Estándares Tecnológicos para la Administración Pública

TUTORIAL SOBRE EL MANEJO DE LA OFICINA VIRTUAL PARA LA REMISIÓN DE INFORMES DE DOCENCIA VIRTUAL VÍA ADMINISTRACIÓN ELECTRÓNICA

Sesión No. 2. Contextualización: Nombre de la sesión: Paquetería ASPEL - COI PAQUETERÍA CONTABLE

PEDRO REVERTE GÓMEZ SERVICIOS DE RED E INTERNET / IMPLANTACIÓN DE APLICACIONES WEB 2º ASIR

Versión 1 Fecha Vigencia: Junio de 2011

INSTALACION DE UN SERVIDOR PENTAHO 5.2 CON POSTGRESQL 9.1 EN LINUX CENTOS 6.6 de 32 BITS

Documentación del Terminal

1 MANUAL DE INSTALACIÓN

Manual para uso de cuentas de

USANDO SQL. EN BASE DE Ooo.

GUÍA PARA MANEJAR GOOGLE DRIVE

PÁGINAS DINÁMICAS WEB CON PHP. Unidad 4 Aplicaciones Web

Para ingresar al mismo debes hacer click en el ícono correspondiente en el panel de control.

Capítulo 3 Diseño del Sistema de Administración de Información de Bajo Costo para un Negocio Franquiciable

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

Manual del del usuario. Curso Multimedia de Tamazight


Manual de Usuario. Generador de Pólizas de Sizes & Colors para CONTPAQi Contabilidad

Organizando mi clase en el GES Material de apoyo

Restricciones (constraints) FOREIGN KEY

Dirección de Informática y Telecomunicaciones

Copyright Arsys Internet S.L. Campañas Online Manual de Usuario

12 Minería de Datos Reglas de asociación.

Bases de Datos. Marta Elena Zorrilla Pantaleón Rafael Duque Medina DPTO. DE MATEMÁTICAS, ESTADÍSTICA Y COMPUTACIÓN

GUÍA DEL ALUMNO. 1.- Estructura y contenido de la página web. 2.- Cómo usar esta página web. 3.- Contenidos. 4.- Metodología didáctica.

Manual Usuario Wordpress. Índice

Web institucional Edición de contenidos en idiomas

Versatils. Apéndice. ODBC Orígenes de datos. ODBC Orígenes de datos.

Hostaliawhitepapers. Usar Plesk para, poner en marcha nuestro dominio.

MANUAL DE USUARIO DE LA HERAMIENTA CONFIGURACION DE PRESUPUESTOS PARA DISTRIBUIDORES

Usuarios y Permisos. Capítulo 12

Desarrollo de sitios web con PHP y MySQL

Instalando CodeKa v1.0 sobre Bitnami Xamp Stack (para Windows, Linux, OS X y Solaris).

Tutorial Sencillo Yii Framework

CORREO ELECTRÓNICO GMAIL. 1 Enviar correo electrónico Acceder a una cuenta de correo electrónico... 2

Symfony Capa de Controladores (Lógica de presentación) Rodolfo Campos

Solución al Reto Hacking v2.0 de Informática 64

Manual del Profesor Campus Virtual UNIVO

Dinámica El framework RADical J2EE sin complicaciones

Guía de uso de Moodle para participantes

ASISTENCIA TÉCNICA A LA SEGURIDAD INFORMÁTICA EN PYMES MANUAL KEEPASS WINDOWS

TUTORIAL CONFIGURACION P2P VTA P _ VTA-83171

Transcripción:

Como usar Zend_Auth del Zend Framework Elaborado por Rob Allen, www.akrabat.com Revision 1.0.4 Copyright 2007 Traducido por Claudio Cossio, www.ajaxcode.net El propósito de este tutorial es dar una introducción básica del componente Zend_Auth en conjunto con el Zend Framework. Da continuidad al tutorial previo de Desarrollo de Aplicaciones con Zend Framework que se encuentra en http://akrabat.com/zend-frameworktutorial para la versión en ingles y para la versión en castellano ir al siguiente enlace http://ajaxcode.net/descargas/desarrollo_aplicaciones_zendframework.pdf NOTA: El código ha sido probado con las versiones 0.9 y 0.9.1 del Zend Framework. Puede existir alguna posibilidad de que funcione con versiones posteriores, pero no funcionara en versiones anteriores de la 0.9. Autenticación Para el propósito de este tutorial, autenticación es el proceso de conceder el acceso a una persona a nuestra aplicación Web. Vamos a modificar la aplicación del listado de CD s creada en el tutorial Desarrollo de Aplicaciones con Zend Framework para que solicite una credencial de acceso para cualquier parte de la aplicación. A grosso modo, vamos a necesitar las siguientes cosas: Crear una tabla de users (registrar unos usuarios). Crear una forma para acceder a la aplicación. Crear un controller que almacenara las acciones (actions) para el acceder (logging in) y salir del sistema (logging out). Alterar el pie de página para facilitar la salida del sistema (log out). Asegurarnos que el usuario ha dado los datos correctos antes de acceder a la aplicación. La tabla de Usuarios. Lo primero que necesitamos será una tabla de usuarios. No necesita ser compleja, así que la estructura será la siguiente: Fieldname Type Null? Notes id Integer No Primary key, Autoincrement username Varchar(50) No Unique key password Varchar(50) No real_name Varchar(100) No Si utilizamos MySQL, la sentencia SQL para crear la tabla será la siguiente: CREATE TABLE users ( id int(11) NOT NULL auto_increment, username varchar(50) NOT NULL, password varchar(50) NOT NULL, real_name varchar(100) NOT NULL, PRIMARY KEY (id), UNIQUE KEY username (username) ) Page 1 of 7

También necesitamos dar de alta un usuario para acceder a la aplicación: INSERT INTO users (id, username, password, real_name) VALUES (1, 'rob', 'rob', 'Rob Allen'); Utiliza esta sentencia en un cliente MySQL como phpadmin o mediante la línea de comandos de MySQL (es obvio de que deberán usar un mejor username y password). Cambios a la Configuración de Arranque (Bootstrap) Para dar un seguimiento del proceso de autenticación del usuario, vamos a utilizar una sesión. Zend Framework nos proporciona Zend_Session_Namespace que nos ofrece una interfase orientada a objetos para sesiones. Los cambios a index.php son: zf-tutorial/index.php: Zend_Loader::loadClass('Zend_Db_Table'); Zend_Loader::loadClass('Zend_Debug'); Zend_Loader::loadClass('Zend_Auth'); // load configuration También aquí... // setup database $dbadapter = Zend_Db::factory($config->db->adapter, $config->db->config->asarray()); Zend_Db_Table::setDefaultAdapter($dbAdapter); Zend_Registry::set('dbAdapter', $dbadapter); // setup controller $frontcontroller = Zend_Controller_Front::getInstance(); Todo lo que tenemos que hacer aquí es asegurarnos de cargar la clase Zend_Auth y registrar la base de datos dentro del adaptador registry. Lo almacenamos en registry por que lo necesitaremos cuando realicemos la autenticación después. El controlador Auth Necesitamos un controlador para almacenar el login y el logout. Se nos hace razonable llamarlo AuthController. Vamos a empezar de lo básico a partir de IndexController: zf-tutorial/application/controllers/authcontroller.php: <?php function init() $this->initview(); $this->view->baseurl = $this->_request->getbaseurl(); function indexaction() Page 2 of 7

Hemos configurado init() para que el view sea inicializado y le podamos asignar el baseurl. También creamos la función indexaction() ya que es requerida por Zend_Controller_Action. No vamos a necesitar indexaction() ya que haremos uso de loginaction() y logoutaction(), así que redirigimos a la ruta por defecto si alguien trata de navegar al directorio auth/index. Acceso al Sistema (Login) Para acceder a nuestra aplicación vamos a necesitar una forma, así que la acción de acceso va a trabajar de igual manera que otras formas dentro de IndexController. El template de la forma estará ubicado en views/scripts/auth/login.phtml y el código estará en AuthController::loginAction(). La forma es sencilla, ya que solo necesitara de dos campos: el nombre del usuario (username) y la contraseña (password): zf-tutorial/application/views/scripts/auth/login.phtml: <?php echo $this->render('header.phtml');?> <h1><?php echo $this->escape($this->title);?></h1> <?php if(!empty($this->message)) :?> <div id="message"> <?php echo $this->escape($this->message);?> <?php endif;?> <form action="<?php echo $this->baseurl?>/auth/login" method="post"> <div> <label for="username">username</label> <input type="text" name="username" value=""/> <div> <label for="password">password</label> <input type="password" name="password" value=""/> <div id="formbutton"> <input type="submit" name="login" value="login" /> </form> <?php echo $this->render('footer.phtml');?> El template interpreta los archivos header.phtml y footer.phtml en la cabecera y el pie de la página. Hacemos hincapié en que solamente se mostrara el mensaje si $this->message no contiene información. Esto es para informarle al usuario que no pudo acceder al sistema. El resto del contenido es el template de la forma. Ahora que disponemos de una forma, vamos a crear un controlador de acción (action controller). Que lo codificamos dentro de AuthController.php: zf-tutorial/application/controllers/authcontroller.php: function loginaction() $this->view->message = ''; $this->view->title = "Log in"; $this->render(); Inicialmente todo lo que debemos hacer es inicializar el titulo y el mensaje, posteriormente se interpretara la forma. Si vamos a la dirección http://zf-tutorial/auth/login debe mostrar la forma para acceder al sistema. Page 3 of 7

Como vamos a procesar la forma una vez enviada la información? Para hacer eso, usamos el mismo método que las formas de add y edit dentro de IndexController y realizamos el proceso si el método de petición es POST. Vamos a modificar la función loginaction() que acabamos de crear: zf-tutorial/application/controllers/authcontroller.php: function loginaction() $this->view->message = ''; if ($this->_request->ispost()) // collect the data from the user Zend_Loader::loadClass('Zend_Filter_StripTags'); $f = new Zend_Filter_StripTags(); $username = $f->filter($this->_request->getpost('username')); $password = $f->filter($this->_request->getpost('password')); if (empty($username)) $this->view->message = 'Please provide a username.'; else // setup Zend_Auth adapter for a database table Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable'); $dbadapter = Zend_Registry::get('dbAdapter'); $authadapter = new Zend_Auth_Adapter_DbTable($dbAdapter); $authadapter->settablename('users'); $authadapter->setidentitycolumn('username'); $authadapter->setcredentialcolumn('password'); // Set the input credential values to authenticate against $authadapter->setidentity($username); $authadapter->setcredential($password); // do the authentication $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authadapter); if ($result->isvalid()) // success: store database row to auth's storage // system. (Not the password though!) $data = $authadapter->getresultrowobject(null, 'password'); $auth->getstorage()->write($data); else // failure: clear database row from session $this->view->message = 'Login failed.'; $this->view->title = "Log in"; $this->render(); Dentro del código hay mucho que comentar, así que empecemos: // collect the data from the user Zend_Loader::loadClass('Zend_Filter_StripTags'); $f = new Zend_Filter_StripTags(); $username = $f->filter($this->_request->getpost('username')); $password = $f->filter($this->_request->getpost('password')); if (empty($username)) $this->view->message = 'Please provide a username.'; else Page 4 of 7

Como es usual se aplica un filtro para extraer los campos de username y password de los datos enviados por POST. Hacemos nota, que de la función getpost() de la petición ya que gestionara la revisión isset() y nos devolverá una cadena (string) vacía si no encuentra el campo dentro del arreglo (array) de POST. Si el username esta vació, no tiene caso realizar la autenticación, inclusive Zend_Auth respondería con una excepción. Por dicha razón se verifica que el username este vació e informar al usuario. // setup Zend_Auth adapter for a database table Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable'); $dbadapter = Zend_Registry::get('dbAdapter'); $authadapter = new Zend_Auth_Adapter_DbTable($dbAdapter); $authadapter->settablename('users'); $authadapter->setidentitycolumn('username'); $authadapter->setcredentialcolumn('password'); Zend_Auth hace uso de un adaptador de sistema que le permite usar cualquier tipo de mecanismos de autenticación. Como vamos a utilizar una tabla de la base de datos, lo haremos con Zen_Auth_Adapter_DbTable. Para inicializar el adaptador, le asignas los campos a utilizar y le envías una conexión valida para la base de datos. // Set the input credential values to authenticate against $authadapter->setidentity($username); $authadapter->setcredential($password); Debemos de indicarle al adaptador exactamente que username y password han sido capturados en la forma por el usuario. // do the authentication $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authadapter); Para realizar la autenticación, llamamos a la función authenticate() de Zend_Auth. Esto nos asegura que el resultado de la autenticación está almacenado automáticamente en la sesión. if ($result->isvalid()) // success : store database row to auth's storage // system. (not the password though!) $data = $authadapter->getresultrowobject(null, 'password'); $auth->getstorage()->write($data); En el caso exitoso de la autenticación, almacenamos el registro completo (excepto la contraseña) de la base de datos dentro de Zend_Auth. Para asegurarnos de que se puede mostrar el nombre del usuario en el pie de la pagina Web (footer.phtml). else // failure: clear database row from session $this->view->message = 'Login failed.'; En el caso de un fallo en la autenticación, se muestra un mensaje en la pagina para informar al usuario del acontecimiento. El proceso de acceder a la aplicación se ha completado. Salir del Sistema (Logout) Para salirse del sistema es mas sencillo que acceder a el, ya que solamente se requiere de borrar la información almacenada en Zend_Auth. Esto se lleva a cabo en la acción (action) logoutaction() dentro del controlador (controller) AuthController para que podamos dirigirnos a la dirección http://zftutorial/auth/logout para que el usuario salga del sistema: Page 5 of 7

zf-tutorial/application/controllers/authcontroller.php: function logoutaction() Zend_Auth::getInstance()->clearIdentity(); La función logoutaction() es tan sencilla, que no necesita mucha explicación. Necesitamos ofrecerle al usuario un enlace para que pueda salir de la aplicación cuando desee. Esto será más sencillo si lo colocamos en el pie de la página. Vamos a informarle al usuario de su nombre, para que tenga la confianza que esta dentro de la aplicación. Su nombre esta almacenado dentro del campo real_name de la tabla users, a la cual ya tenemos acceso por medio de la instancia Zend_Auth. Lo primero que debemos hacer es que view reciba la instancia, lo cual se realiza por medio de la función init() dentro del IndexController(): zf-tutorial/application/controllers/indexcontroller.php: class IndexController extends Zend_Controller_Action function init() $this->initview(); Zend_Loader::loadClass('Album'); $this->view->baseurl = $this->_request->getbaseurl(); $this->view->user = Zend_Auth::getInstance()->getIdentity(); Es muy conveniente que el Zend_Auth es un componente individual, sino fuera así tendríamos que almacenarlo en el registry. Ahora tenemos que agregar HTML al template footer.phtml: zf-tutorial/application/views/footer.phtml: <?php if($this->user) :?> <p id="logged-in">logged in as <?php echo $this->escape($this->user->real_name);?>. <a href="<?php echo $this->baseurl?>/auth/logout">logout</a></p> <?php endif;?> </body> </html> El código HTML ya debería parecerte familiar. Usamos escape() para asegurar que el campo del nombre del usuario se despliegue correctamente y usamos baseurl para establecer el sitio correcto del lugar donde se mostrara. Esto es todo lo que se requiere para salirse del sistema. Protección de las Acciones (Actions) Lo que falta por hacer es asegurarnos de que ninguna de las acciones (actions) sea accesible si no se ha registrado el usuario. Para hacer eso, necesitamos agregar más código a la función de predispatch() dentro del IndexController. Page 6 of 7

zf-tutorial/application/controllers/indexcontroller.php: class IndexController extends Zend_Controller_Action function predispatch() $auth = Zend_Auth::getInstance(); if (!$auth->hasidentity()) $this->_redirect('auth/login'); La función predispatch() es llamada antes de cualquier acción (action) dentro del controller. Recibimos la instancia Zend_Auth y después su función hasidentity() nos señalara si el usuario puede acceder al sistema. Si no cuenta con el acceso lo dirigimos al action auth/login. De esta manera ya terminamos nuestra aplicación! Conclusión Así concluimos nuestra breve introducción de como integrar Zend_Auth dentro de una aplicación MVC. Esta muy claro que hay mas cosas que se pueden hacer con Zend_Auth, especialmente si se tienen varios controladores que se quieren proteger. Hacemos hincapié en que no hemos visto a detalle el método de autorización aquí, hace falta ver lo que nos puede ofrecer el componente Zend_Acl. Zend_Acl puede ser utilizado en conjunto con Zend_Auth para proveer diferentes niveles de acceso a los actions y a la información, pero este es un tema para otro tutorial. Espero que hayan encontrado el tutorial interesante e informativo. Si encuentran algún error, por favor hacerlo de mi conocimiento escribiendo a rob@akrabat.com. Nota: El idioma del autor es ingles, si tienen alguna duda o comentario que quieran hacer de la traducción o del tutorial en castellano por favor manden un correo a ccossio@ajaxcode.net. Page 7 of 7