February 4th, 2009 Category: Zend Framework
4 Comments »

En los casos comunes de autenticaciones con Zend_Auth nosotros le pasamos un usuario y una clave, pero hay veces que necesitamos que valide por mas datos.

Una autenticacion comun seria la siguiente.

 Zend_Loader::loadClass( 'Zend_Auth_Adapter_DbTable' );
 $dbAdapter = Zend_Registry::get( 'dbAdapter' );
 $authAdapter = new Zend_Auth_Adapter_DbTable( $dbAdapter );
 $authAdapter->setTableName( 'SYS_USER' );
 $authAdapter->setIdentityColumn( 'username' );
 $authAdapter->setCredentialColumn( 'password' );
 $authAdapter->setIdentity( strtolower( trim( $username )) );
 $authAdapter->setCredential( md5( $passwd ));
 $auth = Zend_Auth::getInstance();
 $result = $auth->authenticate( $authAdapter );

Pero que pasa si ademas necesitamos validar si el usuario esta o no activo en el sistema, o si no esta suspendido temporalmente?

Nososotros podemos pasarle un parametro extra a Zend_Auth_Adapter_DbTable, para que filtre por mas datos.

Por ejemplo el caso anterior, quedaria de la siguiente manera si ademas nosotros queremos saber si el campo status = ‘A’

 Zend_Loader::loadClass( 'Zend_Auth_Adapter_DbTable' );
 $dbAdapter = Zend_Registry::get( 'dbAdapter' );
 $authAdapter = new Zend_Auth_Adapter_DbTable( $dbAdapter, 'SYS_USER', 'username', 'password', "MD5( ? ) AND status = 'A' " );
 $authAdapter->setIdentity( strtolower( trim( $username )) );
 $authAdapter->setCredential( md5( $passwd ));
 $auth = Zend_Auth::getInstance();
 $result = $auth->authenticate( $authAdapter );

De esta forma, cada vez que intentemos loguearnos nos va a encriptar la clave con la funcion MD5, y preguntar si status =’A’.

Si ustedes no necesitan encriptar la clave pueden usar directamente el signo de pregunta sin la funcion MD5, tambien pueden agregar mas funcionalidades, para mas detalle mirar la documentacion oficial

En el administrador del blogzf tenemos un ejemplo de implementacion de este sistema.


Invitame una Cerverza


Comentar


4 Responses

exos 2009-02-17 12:11:39
Todo muy lindo, pero sigo pensando que:

md5( $passwd )

hoy por hoy es casi lo mismo que guardar la pass en texto plano, y que con un DB de 30GB tenes todas las combinaciones posibles de MD5 (y aunque tarde hasta dias), es como vulnerable, mas alla de que la mayoria de los usuarios pone passwords pelotudas como "sombrilla", y la sacan con diccionarios.

Lo mejor para mi es tener una key, (en php podes trabajar en bluefish) y encriptar asi :-).

private $int_key = '$2a$Dbf·21.311#i';

private function keyFrom (&$dato) {
return crypt($dato,$this->int_key);
}

public function firma (&$dato) {
return sha1($this->keyFrom($dato));
}

Asi obtenes un sha1 de una key generada de la contraseña y otra key bluefish.

¿¿¿¿¿paranoico yo?????

Pablo Morales 2009-02-23 23:04:36
En otro articulo tambien uso passphrase, y hablo de lo que mencionas, es real que el md5 se esta volviendo obsoleto y ni un passphrase lo vuelve seguro. En los sistemas que trabajo actualemente uso crypt con el que obtengo claves realmente seguras.

Isra 2009-03-26 05:45:50
Bueno, está claro que blowfish es una buena alternativa al cracking por fuerza bruta, pero un doble md5 es rápido, sencillo y seguro.

Pablo Morales 2009-03-26 08:31:41
Creo que a este nivel la optimizacion no es un problema, estamos hablando de una operacion que solo se usa en el registro y en el login. Mucho mas que google account no te va a tardar. Tengo que hacerme tiempo y postear lo que uso en mis sistemas