December 29th, 2011 Category: Curso Zend Framework
41 Comments »

En los anteriores capitulos habiamos usado el video como metodo de aprendizaje, hoy habiendo cubierto la parte inicial y basica de Zend Framework, creo que estamos preparados para dejar el video atras, y continuar los capitulos leyendo un poco.

En este capitulo vamos a ver como crear un sistema de login en nuestro proyecto. Nosotros actualmente en nuestro portal de noticias tenemos una pantalla donde publicamos nuestras noticias. Pero actualmente esa pantalla es accesible por cualquier persona.

El objetivo de este capitulo es crear una pantalla de login, y restringir el acceso a la administracion de las noticias solo a las personas que tengan usuario y contraseña.

Lo primero que vamos a hacer es crear un nuevo controller, UsuarioController.php

El codigo de este controller inicialmente sera asi.


class UsuarioController extends Zend_Controller_Action
{

    public function init()
    {

    }

    public function loginAction()
    {
        $form = new Application_Form_Login();

        if( $this->getRequest()->isPost() ){

            if( $form->isValid( $this->_getAllParams() )) {

                // Do something
            }
        }

        $this->view->form = $form;
    }

}

Para este controller vamos a tener que crear una vista asi que creamos la carpeta en views/scripts/usuario y agregamos el archivo login.phtml, donde vamos a imprimir el formulario y mostrar un mensaje, el archivo quedaria asi

<div>
    <h2>Ingresar al sistema</h2>
    <?php echo $this->form ; ?>
</div>

Tambien vamos a necesitar un formulario para poder ingresar usuario y contraseña.

Creamos el archivo en forms/Login.php

Este formulario va a tener un input para el usuario otro para el contraseña, y el boton de submit, el formulario Login.php nos quedaria asi.


class Application_Form_Login extends Zend_Form
{

    public function init()
    {

        $this->addElement(
            'text', 'username', array(
                'label' => 'Usuario:',
                'required' => true
            )
        );

        $this->addElement(
            'password', 'password', array(
                'label' => 'Contraseña:',
                'required' => true
            )
        );

        $this->addElement(
                'submit', 'Ingresar', array()
        );
    }

}

Hasta ahora no vimos nada nuevo, es mas o menos el mismo mecanismo que usamos para crear un nuevo post. Si entramos en la url de nuestro proyecto /usuario/login vamos a ver el formulario de login como aparece en la siguiente imagen.

Ahora que tenemos el codigo vamos a crear una tabla donde se van a guardar todos los usuarios que van a tener permisos al panel de administracion de nuestro proyecto. El sql para crear la tabla es el siguiente.

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(40) NOT NULL,
  `password` char(40) NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
);

INSERT INTO `users` (`username`, `password`) VALUES
    ('pablo', '7c4a8d09ca3762af61e59520943dc26494f8941b');

Nuestra tabla de usuario es bastante sencilla, por ahora vamos a cumplir con los requerimientos minimos. El hash extraño que se ve es la contraseña “123456″ encriptada con la funcion sha1()

Ahora que ya tenemos un usuario (pablo) y una contraseña (123456), nos falta agregar la logica para que se valide si el usuario existe o no.

Zend Framework nos brinda el componente Zend_Auth el cual a partir de sus Adapters, nos permite validar un usuario y loguearlo en el sistema. La forma de usarlo es bastante simple, Zend Auth entiende identidad y credencial, donde la identidad es el nombre de usuario o mail que vamos a usar para identificar a un usuario dentro del sistema, y la credencia es la contraseña.

Nosotros vamos a usar Zend_Db_Adapter_DbTable el cual se encarga de validar el usuario y contraseña en nuestra base de datos.

El codigo cuando usemos Zend_Auth deberia ser el siguiente.

$authAdapter = new Zend_Auth_Adapter_DbTable();

$authAdapter
    ->setTableName('users')
    ->setIdentityColumn('username')
    ->setCredentialColumn('password');

$authAdapter
    ->setIdentity('pablo')
    ->setCredential(sha1('123456'));

$auth = Zend_Auth::getInstance();

$result = $auth->authenticate($authAdapter);

if(  $result->isValid() ){
    echo "Estamos Logueado!";
}else{
    echo "Datos incorrecto";
}

Ahora este codigo vamos a adaptarlo a nuestro controller. Nos quedaria asi

class UsuarioController extends Zend_Controller_Action
{

    public function init()
    {

    }

    public function loginAction()
    {
        $form = new Application_Form_Login();

        if( $this->getRequest()->isPost() ){

            if( $form->isValid( $this->_getAllParams() )) {

                $authAdapter = new Zend_Auth_Adapter_DbTable();
                $authAdapter
                    ->setTableName('users')
                    ->setIdentityColumn('username')
                    ->setCredentialColumn('password');

                $authAdapter
                    ->setIdentity($form->getValue('username'))
                    ->setCredential(sha1($form->getValue('password')));

                $auth = Zend_Auth::getInstance();

                $result = $auth->authenticate($authAdapter);

                if(  $result->isValid() ){
                    return $this->_redirect('/posts/listar');
                }else{
                    $form->username->addErrorMessage('Datos Incorrectos');
                }
            }
        }
        $this->view->form = $form;
    }

}

Con este codigo cada vez que nos identifiquemos correctamente nos va a redirigir a /posts/listar donde vamos a mostrar todas las noticias.

Ahora los que nos faltaria agregar es que en cada lugar donde nosotros queramos restringir el acceso, agregar el chequeo si el usuario esta logueado o no, sino esta logueado vamos a redireccionarlo a la pantalla de login.

En cada action que querramos validar esto vamos a agregar el siguiente codigo.

$auth = Zend_Auth::getInstance();
if (! $auth->hasIdentity()) {
    return $this->_redirect('/usuarios/login');
}

Notese que en el caso de PostsController, tenemos metodos que son de acceso publico y acceso privado, si llegado el caso tenemos un Controller donde necesitamos que todos los metodos sean de alcance privado, las lineas de arriba podemos escribirlas en el metodo init() de nuestro controller, ese metodo init se va a llamar antes de ejecutar un action de ese controller, y de esta forma evitamos repetir codigo.

Hay otras practicas para mejorar esto pero eso podemos verlo mas adelante.

Ahora que restringimos el acceso, vamos a necesitar la posiblidad de desloguearnos del sistema, para eso vamos agregar un link en nuestro layout.phtml en la parte del menu, que nos redireccione a /usuarios/logout y este es el codigo de nuestro action para desloguarnos.

public function logoutAction()
{
    Zend_Auth::getInstance()->clearIdentity();
    return $this->_redirect('/usuario/login');
}

Bastante simple, no :D , asi es todo con Zend Framework.

Ahora, vamos a dejarlo mas bonito a todo esto, y vamos validar en la vista si el usuario esta logueado, voy a mostrar un link a logout, si esta deslogueado voy a mostrar un link a la pantalla de login. El codigo a agregar en nuestro layout seria el siguiente.

<?php
$auth = Zend_Auth::getInstance();
if ( $auth->hasIdentity()) :
?>
    <li>Usuario:<?php echo $auth->getIdentity() ?></li>
    <li><a href="/usuario/logout">Logout</a>
<?php else: ?>
    <li><a href="/usuario/login/">Login</a>
<?php endif;?>

Y con esto ya somos capaces de agregar un sistema de login en nuestros proyectos usando Zend Framework.

Ver todos los capitulos del curso

Seguir leyendo

December 19th, 2011 Category: eventos
1 Comment »

Este tiempo desde que subo los videos tengo un feedback de la gente que sigue este blog muy grande. Por este quiero probar de juntarnos virtualmente con google plus, hacer un hangout , y poder compartir experiencia, y los que tengan ganas pueden usarlo para sacarse las dudas que tengan.

 

Es bastante informal, no va a ver lista de invitados ni nada de eso, a las 21hs Hora Argentina,  abro el hangout invito a los que esten online en ese momento, y dejo abierto para que lo llenen los que quieran participar, personalmente creo que esta bueno para que planteen algun tema para los proximos videos, o como les decia antes sacarse alguna duda.

 

Los espero, el martes 19 de diciembre a las 21hs Argentina, en google plus.
Agreguenme asi los tengo a mano.

 

https://plus.google.com/113488230260400531922

 

 

 

Seguir leyendo