TigerZF
🌐Español

9.3. Autenticación de usuarios en Zend Framework

9.3.1. Introducción a la autenticación

Una vez que una aplicación web ha sido capaz de distinguir a un usuario de otro estableciendo una sesión, las aplicaciones web normalmente desean validar la identidad de un usuario. El proceso de validar que un consumidor es auténtico es la "autenticación". La autenticación se compone de dos partes distintivas: una identidad y un conjunto de credenciales. Se necesita alguna variación de ambas presentadas a la aplicación para que esta pueda procesarlas y así autenticar a un usuario.

Si bien el patrón más común de autenticación gira en torno a nombres de usuario y contraseñas, cabe destacar que este no es siempre el caso. Las identidades no se limitan a los nombres de usuario. De hecho, se puede usar cualquier identificador público: un número asignado, un número de seguro social o una dirección de residencia. Del mismo modo, las credenciales no se limitan a las contraseñas. Las credenciales pueden presentarse en forma de información privada protegida: huella dactilar, escaneo de retina, frase de contraseña, o cualquier otra información personal poco habitual.

9.3.2. Uso básico de Zend_Auth

En el siguiente ejemplo, usaremos Zend_Auth para completar lo que probablemente sea la forma más habitual de autenticación: nombre de usuario y contraseña a partir de una tabla de base de datos. Este ejemplo asume que ya ha configurado su aplicación usando Zend_Application, y que dentro de esa aplicación ha configurado una conexión de base de datos.

La función de la clase Zend_Auth es doble. Primero, debe poder aceptar un adaptador de autenticación para usarlo al autenticar a un usuario. En segundo lugar, tras una autenticación exitosa de un usuario, debe persistir a lo largo de cada petición que pueda necesitar saber si el usuario actual ha sido efectivamente autenticado. Para persistir estos datos, Zend_Auth utiliza Zend_Session_Namespace, pero generalmente nunca necesitará interactuar con este objeto de sesión.

Supongamos que tenemos la siguiente tabla de base de datos configurada:

CREATE TABLE users (
    id INTEGER  NOT NULL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(32) NULL,
    password_salt VARCHAR(32) NULL,
    real_name VARCHAR(150) NULL
)

Lo anterior muestra una tabla de usuarios que incluye un nombre de usuario, una contraseña y también una columna de salt de contraseña. Esta columna de salt se usa como parte de una técnica llamada "salting" que mejoraría la seguridad de su base de datos de información frente a ataques de fuerza bruta dirigidos al algoritmo de su hash de contraseñas. Más información sobre el salting.

Para esta implementación, primero debemos crear un formulario simple que podamos utilizar como el "formulario de inicio de sesión". Usaremos Zend_Form para lograrlo.

// located at application/forms/Auth/Login.php

class Default_Form_Auth_Login extends Zend_Form
{
    public function init()
    {
        $this->setMethod('post');

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

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

        $this->addElement('submit', 'submit', array(
            'ignore'   => true,
            'label'    => 'Login',
            ));

    }
}

Con el formulario anterior, ya podemos crear nuestra acción de inicio de sesión para nuestro controlador de autenticación. Este controlador se llamará "AuthController", y estará ubicado en application/controllers/AuthController.php. Tendrá un único método llamado "loginAction()" que servirá como la acción autopublicante. En otras palabras, independientemente de si la url se solicitó mediante POST o GET, este método manejará la lógica.

El siguiente código demostrará cómo construir el adaptador adecuado e integrarlo con el formulario:

class AuthController extends Zend_Controller_Action
{

    public function loginAction()
    {
        $db = $this->_getParam('db');

        $loginForm = new Default_Form_Auth_Login();

        if ($loginForm->isValid($_POST)) {

            $adapter = new Zend_Auth_Adapter_DbTable(
                $db,
                'users',
                'username',
                'password',
                'MD5(CONCAT(?, password_salt))'
                );

            $adapter->setIdentity($loginForm->getValue('username'));
            $adapter->setCredential($loginForm->getValue('password'));

            $auth   = Zend_Auth::getInstance();
            $result = $auth->authenticate($adapter);

            if ($result->isValid()) {
                $this->_helper->FlashMessenger('Successful Login');
                $this->_redirect('/');
                return;
            }

        }

        $this->view->loginForm = $loginForm;

    }

}

El script de vista correspondiente es bastante sencillo para esta acción. Establecerá la url actual, ya que este formulario se autoprocesa, y mostrará el formulario. Este script de vista se encuentra en application/views/scripts/auth/login.phtml:

$this->form->setAction($this->url());
echo $this->form;

Y eso es todo. Con estos conceptos básicos puede ampliar las ideas generales para incluir escenarios de autenticación más complejos. Para más información sobre otros adaptadores de Zend_Auth, consulte la guía de referencia.