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.
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.