Herramientas de usuario

Herramientas del sitio


cursos:yii:login

Identificación de usuarios

La acción site/login utiliza un modelo llamado LoginForm, que se encarga de gestionar la entrada en sesión de un usuario. En el método login() de este modelo se crea una instancia del componente UserIdentity (en protected/components), que es el que se encarga de validar el usuario y contraseña introducidos y devolver los datos del usuario o un código de error si no son correctos. Si lo son, llama al método Yii::app()→user→login, y el usuario quedará registrado en la sesión.

Para hacer una validación con una tabla de la base de datos, haremos lo siguiente: En el método authenticate de UserIdentity comprobaremos si las propiedades username y password se corresponden con los de un usuario activo:

....
public $datos; //Datos del usuario, para poder guardar en sesión
...
 
public function authenticate() {
 
        $user=Usuarios::model()->find('usuario=?',array($this->username));
        if($user===null)
            $this->errorCode=self::ERROR_USERNAME_INVALID;
        else if(md5($this->password)!==$user->password)  
            $this->errorCode=self::ERROR_PASSWORD_INVALID;
        else {
            $this->datos=$user;
            $this->errorCode=self::ERROR_NONE;
        }
        return !$this->errorCode;
}

El password no se guarda habitualmente en la base de datos en formato plano, sino aplicando algún algoritmo de encriptación. En este caso hemos utilizado md5. Lo que haremos será comparar la contraseña guardada con md5() de la contraseña introducida por el usaurio.

Habitualmente, necesitamos guardar en sesión datos adicionales del usuario, como su nombre, su email, sus permisos,etc… Para ello, definimos la propiedad $datos en UserIdentity y guardamos en ella el objeto $user de la tabla de usuarios. De esta forma, en el método login() de LoginForm podemos guardar en sesión lo que deseemos:

	public function login()
	{
		if($this->_identity===null)
		{
			$this->_identity=new UserIdentity($this->username,$this->password);
			$this->_identity->authenticate();
		}
		if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
		{
			$duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
			Yii::app()->user->login($this->_identity,$duration);
 
			//Guardamos datos del usuario. Puede ser cualquier dato del objeto $this->_identity->datos que se asignó en **authenticate()**. Ejemplos:
			Yii::app()->user->setState('nombre',$this->_identity->datos->nombre);
                        //El dato id que guarda Yii por defecto es el nombre de usuario. Podemos 
                        //sustituirlo por su código
			Yii::app()->user->setState('id',$this->_identity->datos->id);
			Yii::app()->user->setState('roles',$this->_identity->datos->roles);
 
			return true;
		}
		else
			return false;
	}

Todos los datos guardados en la sesión serán accesibles después desde Yii::app()→user→DATO:

echo Yii::app()->user->nombre;