Posts Tagged Zend_Auth

Autenticar un usuario en Zend Framework – Identificar usuario

Siguiendo el hilo del apunte anterior vamos a ver como identificar un usuario una vez programado el adaptador.

El componente Zend_Auth implemente el patrón Singleton de diseño. Esto quiere decir que en todo momento sólo tendremos una instancia de esta classe y que para obtenerla deberemos utilizar su método estático getInstance(). La instancia de Zend_Auth será la que utilizaremos para identificar al usuario una vez obtengamos sus datos.

Formulario para identificar

Para identificar un usuario, en nuestro caso, nos hace falta conocer su nombre de registro (nickname, mail o lo que se utilice) y su contraseña. Con un formulario estándar nos bastará:
<form action="/authentication/login" method="post">
<input type="text" name="username"/>
<input type="password" name="pwd"/>
</form>
Podemos observar que el formulario apunta al controlador AuthenticationController y la acción loginAction. Aquí es dónde identificaremos el usuario.

Identificar el usuario en el controlador

Para identificar al usuario deberemos implemetar la acción loginAction dentro del controlador que se encargue de identificar a los usuarios (no tiene por qué ser AuthenticationController). Veamos un ejemplo:
<?php
class RegisterController extends Zend_Controller_Action{
...
public function loginAction(){
require_once('/path/to/AuthenticationAdapter.php');
$auth = Zend_Auth::getInstance();
/* Comprovaciones de que $_POST['username'] y
* $_POST['pwd'] existen */
if(/* Existen y cumplen las restricciones*/){
$adapt = new AuthenticationAdapter($_POST['username'], $_POST['pwd']);
$res = $auth->authenticate($adapt);
if($res->getCode() == Zend_Auth_Result::SUCCESS){
/* Esta línea es muy importante porqué es la que nos grabará los datos que hemos
* introducido en la variable $sessionData (en el post anterior) en la session */
$auth->getStorage()->write($result->getIdentity());
}
}
}
A partir de aquí se puede diferenciar más el comportamiento del sistema en función del $res->getCode() por ejemplo. Un switch-case nos puede servir para diferenciar un error en el nombre de usuario o en la contraseña.

Consultar si un usuario está identificado

Una vez identificado el usuario y guardados los datos que queremos (session) tendríamos que poder acceder a esta información desde cualquier punto del sistema. Esto se puede hacer a través del método hasIdentity() del componente Zend_Auth. Veamos un ejemplo de como lo utilizaríamos si quisiéramos redirigir a la página principal un usuario que no está identificado:
/* En alguna action que no queremos que los usuarios no identificados vean */
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity()==true){
/* Si está identificado guardaremos los datos
* que pusimos en $sessionData en la variable $identity */
$identity = $auth->getIdentity();
}else{
/* Si no está identificado lo redirigimos al document root */
$this->_redirect('/');
}
Espero que a partir de aquí podais identificar vuestros propios usuarios :) Os dejo la dirección del manual de referencia del Zend Framework porqué, una vez llegados a este punto, las posibilidades que tenemos con Zend_Auth son enormes.

Si teneis alguna duda ya sabeis, comentad!

, , , , ,

No Comments

Autenticar un usuario en Zend Framework – Crear el adaptador

Después de pelearnos nuestras horas con el framework de Zend hemos conseguido identificar un usuario con las herramientas que provee este framework (Zend_Auth). La adapatación no ha sido al 100% porqué teniendo la información relativa a los usuarios en una base de datos no utilizamos el adaptador que Zend tiene empleado para estos fines (Zend_Auth_Adapter_DbTable) sino que implementamos un adaptador desde cero.

Antes de empezar a definir que nos hace falta para poner en marcha la identificación de usuario comentamos que estos pasos se han realizado en un servidor Lighttpd-MySQL-PHP5 en un sistema operativo Ubuntu 8.10. Ahora sí, vamos a ver como establecer una autentificación de usuarios:

Implementar un adaptador para autentificar usuarios

Este paso se puede modificar según el origen de la información que vayamos a usar. El framework tiene soluciones específicas para datos de acceso almacenados en base de datos, provenientes de peticiones HTTP, de un servidor LDAP o por OpenID. Como hemos comentado al principio nuestros datos estan almacenados en una base de datos pero vamos a implementar un adaptador desde cero.

Para implementar un adaptador desde cero debemos implementar la interfície Zend_Auth_Adapter_Interface, para eso deberemos implementar obligatoriamente el metodo authenticate() (por razones derivadas de la herencia) y también le añadiremos un par de cositas más. Este adaptador debe recibir la información necesaria para identificar un usuario y realizar la comprovación.

Veamos un ejemplo de la classe:
<?php
class AuthenticationAdapter implements Zend_Auth_Adapter_Interface{

private $_username = null;
private $_password = null;

public function __construct($username, $password){
$this->_username = $username;
$this->_password = $password;
}

public function authenticate(){
//TODO comprobar si $username y $password estan presentes en la base de datos
...

if(/* Estan presentes*/){
/* $sessionData es una variable con la información que queremos guardar en sessión */

return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS,$sessionData);
}else{
/* Si no esta el $username */
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND,$sessionData);

/* Si el password es incorrecto */
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID,$sessionData);

/* Error en la identificación por otros motivos */
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE,$sessionData);
}
}
}

En el próximo post seguiremos con el controlador y como utilizar este adaptador. No falteis!

, , , , , ,

1 Comment