Zend 1.9 Uso de Zend_Auth – 2

Zend_Auth es aquella parte de Zend encargada de la Autenticación.

La Autenticación es el proceso en el que se realiza una prueba para determinar si alguien es realmente quien dice ser.
Esta prueba exige que el sujeto en cuestion posea una credencial, que será evaluada para probar su validez.
Para ejemplificar la idea de la autenticación, tomemos el caso de la prueba de autenticidad de piezas históricas.
En este caso es necesario que un profesional con un conocimiento relativo a la pieza de estudio evalúe las señas y características de la misma para confirmar o no su autenticidad.

En esta prueba, un elemento importante es el adaptador (que tendría un papel similar al del profesional), que es usado para autenticar en contra de un tipo particular de servicio de autenticación, como LDAP, RDBMS, o almacenamiento basado en ficheros. Diferentes adaptadores pueden tener opciones y comportamientos muy diferentes, pero algunas cosas básicas son comunes entre los adaptadores de autenticación. Por ejemplo, aceptar credenciales de autenticación (incluyendo una identidad supuesta), realizar consultas ante el servicio de autenticación, y regresar resultados, son comunes para los adaptadores Zend_Auth .

Existen algunas clases ya implementadas en Zend , pero la norma es permitir la flexibilidad, por ejemplo si se usa doctrine se debería tener una clase que derive de Zend_Auth_Adapter_Interface que es de donde deriva cualquier otra clase usada como adapter.

Por ejemplo se puede tener un archivo con : el nombre,el nombre real (o realm) y el password en esta forma :

someUser:Some Realm:fde17b91c3a510ecbaf7dbd37f59d4f8

donde :
someUser es Usuario.
Some Realm es Nombre real
fde17b91c3a510ecbaf7dbd37f59d4f8 es el resultado de aplicar md5 a someUser,Some Realm y la clave(en plain text).

La clase que trabaja con este tipo de autenticación es

Zend_Auth_Adapter_Digest($filename,$realm,$username,$password);

Por ejemplo para el caso anterior :
filename puede ser cualquier archivo de texto con el contenido mostrado, $username seria “someUser” y $password seria “somePassword”.

$values = $form->getValues(); // $values contiene los datos enviados desde un formulario
$filename = "autenticacion.txt";
$realm = "Some Realm";
$adapter = new Zend_Auth_Adapter_Digest($filename, $realm, $values['username'], $values['password']);*/
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($adapter);
if ($result->isValid()) {
//codigo para un usuario autorizado
}

La parte que esta resaltada es la que se puede cambiar por otro tipo de adaptador,como LDAP, RDBMS.

Adaptadores :
Cada clase adaptadora Zend_Auth implementa Zend_Auth_Adapter_Interface . Esta interface define un metodo, authenticate() , que la clase adaptadora debe implementar para realizar una peticion de autenticación. Cada clase adaptadora debe ser preparada antes de llamar a authenticate().
Esta preparación del adaptador incluye la creación de credenciales (p.ej. nombre de usuario y contraseña) y la definición de valores para opciones de configuración especificos del adaptador, como valores de conexión a base de datos para un adaptador de tabla de base de datos.

El siguente ejemplo es un adaptador de autenticación que requiere de un nombre de usuario y contraseña para la autenticación. Otros detalles, como la forma de realizar peticiones al servicio de autenticación, han sido omitídos por brevedad:

class Application_Model_AdapterBd implements Zend_Auth_Adapter_Interface{

//Código complementario, incluyendo su constructor

// main authentication method
// queries database for match to authentication credentials
// returns Zend_Auth_Result with success/failure code
    public function authenticate() {
        // la variable $result almacena el resultado de la prueba aplicada
        // a los datos del usuario para determinar su validez.
        // puede ser un simple if
        if ($result != -1) {
            return new Zend_Auth_Result(
                    Zend_Auth_Result::SUCCESS, $this->username, array());
        } else {
            return new Zend_Auth_Result(
                    Zend_Auth_Result::FAILURE, null,
                    array('Authentication unsuccessful')
            );
        }
    }
}

Como se ha indicado en este bloque de código, el método authenticate() debe regresar una instancia de Zend_Auth_Result (o de una clase derivada de Zend_Auth_Result ). Si por alguna razón es imposible realizar una petición de autenticación, el método authenticate() debería arrojar una excepción que se derive de Zend_Auth_Adapter_Exception.

Resultados
Los adaptadores Zend_Auth regresan una instancia de Zend_Auth_Result a través del método authenticate() para representar el resultado de un intento de autenticación. Los adaptadores llenan el objeto Zend_Auth_Result en cuanto se construye, así que los siguientes cuatro métodos proveen un grupo básico de operaciones “frente al usuario” que son comunes a los resultados de adaptadores Zend_Auth:

– isValid()
– getCode()
– getIdentity()
– getMessage()
El desarrollador podría desear ramificar basado en el tipo de resultado de la autenticación a fin de realizar operaciones mas específicas. Algunas operaciones que los desarrolladores podrían encontrar útiles son: bloquear cuentas despues de varios intentos fallidos de ingresar una contraseña, marcar una dirección IP despues de que ha intentado muchas identidades no existentes, y proporcionar al usuario mensajes especificos resultados de la autenticación.

Persistencia de Identidad
Autenticar una petición que incluye credenciales de autenticación es util por sí mismo, pero también es importante el soportar mantener la identidad autenticada sin tener que presentar las credenciales de autenticación con cada petición.

HTTP es un protocolo sin estado, sin embargo, se han desarrollado técnicas como las cookies y sesiones a fin de facilitar mantener el estado a través de multiples peticiones en aplicaciones web del lado del servidor.

Persistencia por Defecto en la Sesión PHP

Por defecto, Zend_Auth provee almacenamiento persistente de la identidad desde un intento de autenticación exitoso usando la sesión PHP. En un intento de autenticación exitoso, Zend_Auth::authenticate() almacena la identidad del resultado de autenticación en almacenamiento persistente. A menos que se configure diferente, Zend_Auth usa una clase de almacenamiento llamada Zend_Auth_Storage_Session , la cual, a su vez usa Zend_Session . Una clase diferente podría ser utilizada mediante proveer un objeto que implemente Zend_Auth_Storage_Interface a Zend_Auth::setStorage().

Modificando el espacio de nombre de la sesion

La clase Zend_Auth_Storage_Session se encuentra en [path a la libreria Zend]AuthStorage y usa un namespace de sesión denominado ‘Zend_Auth’, este namespace podría ser sobreescrito al pasar un valor diferente al contructor de Zend_Auth_Storage_Session , este valor es pasado internamente al constructor de Zend_Session_Namespace, como puede verse en el código sgte.


/**
     * Default session namespace
     */
    const NAMESPACE_DEFAULT = 'Zend_Auth';

 /**
     * Default session object member name
     */
    const MEMBER_DEFAULT = 'storage';

// resto de código

/**
     * Sets session storage options and initializes session namespace object
     *
     * @param  mixed $namespace
     * @param  mixed $member
     * @return void
     */
    public function __construct($namespace = self::NAMESPACE_DEFAULT, $member = self::MEMBER_DEFAULT)
    {
        $this->_namespace = $namespace;
        $this->_member    = $member;
        $this->_session   = new Zend_Session_Namespace($this->_namespace);
    }

// Almacena una referencia a la instancia Singleton de Zend_Auth
$auth = Zend_Auth::getInstance();
// Usa 'unEspacionombre' en lugar de 'Zend_Auth'
$auth->setStorage(new Zend_Auth_Storage_Session('unEspacionombre'));
/** * @todo Set up the auth adapter, $authAdapter */// Autenticar, almacenando el resultado, y persistiendo la identidad en// suceso

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

Esto debería ocurrir antes de que se intente la autenticación, ya que Zend_Auth::authenticate() realiza el almacenamiento automático de la identidad.

Implementando Almacenamiento Personalizado
En ocasiones los desarrolladores podrían necesitar usar un comportamiento diferente de persistencia de identidad que el provisto por Zend_Auth_Storage_Session . Para esos casos los desarrolladores podrían simplemente implementar Zend_Auth_Storage_Interface y suplir una instancia de la clase a Zend_Auth::setStorage() .

Uso
Hay dos formas provistas de usar adaptadores Zend_Auth:

– indirectamente, a través de Zend_Auth::authenticate()

– directamente, a través del metodo authenticate() del adaptador

El código de “Ejemplo de una autenticación con Zend_Auth_Adapter_Digest” usa indirectamente el Adaptador Zend_Auth_Adapter_Digest.

// Configura el adaptador de autenticación
$authAdapter = new MyAuthAdapter($username, $password);
// Intenta la autenticación, almacenando el resultado
$result = $authAdapter->authenticate();
if (!$result->isValid()) {
// Autenticación fallida, imprime el porque
    foreach ($result->getMessages() as $message) {
        echo "$messagen";
    }
} else {
    // Autenticación exitosa
    // $result->getIdentity() === $username
}

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s