Herramientas de usuario

Herramientas del sitio


cursos:yii2: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, por defecto se crea una instancia del modelo User, 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.

El modelo User que se genera por defecto no utiliza accesos a base de datos. Únicamente valida los usuarios admin y demo, predefinidos en un array.

Validación de usuarios sobre base de datos

En Security/AUthentication de la guía de usuario se explica con detalle el funcionamiento de la autorización en yii. Si nuestra tabla de usuarios se llama así, usuarios, lo más práctico es que en lugar de utilizar el modelo User para autenticación, utilicemos el modelo Usuarios, que habremos generado previamente con gii. Para ello, ese modelo ha de implementar los métodos impuestos por el interface IdentiyInterface, que son los que permiten localizar un usuario, validar el password, etc.. Si suponemos que nuestra tabla usuarios tiene las columnas usuario para identificar el nombre de usuario, y password para guardar la contraseña encriptada con md5 o crypt, los pasos que tenemos que hacer para que yii identifique la sesión con los usuarios de esta tabla son:

  • En config/web.php: EN components→user cambiamos 'identityClass'⇒'app\models\User' por '\app\models\Usuarios'
  • En models/Usuarios.php:
class Usuarios extends \yii\db\ActiveRecord implements \yii\web\IdentityInterface { \\Añadimos implements...
 
  public static function findByUsername($username) {
	return static::findOne(['usuario' => $username]);
  }
 
  public static function findIdentity($id) {
     return static::findOne($id);
  }
 
  public function getId() {
      return $this->id;
  }
 
  public function getAuthKey() { }
 
  public function validateAuthKey($authKey) { }
  public static function findIdentityByAccessToken($token, $type = null) {}  
 
  // Comprueba que el password que se le pasa es correcto
  public function validatePassword($password) {
       return $this->password === md5($password); // Si se utiliza otra función de encriptación distinta a md5, habrá que cambiar esta línea
  }
}
  • En models\LoginForm.php, el método GetUser utilizará el modelo Usuarios, en lugar de User:
   public function getUser()  {
        if ($this->_user === false) {
            $this->_user = Usuarios::findByUsername($this->username);
        }
 
        return $this->_user;
    }
  • Si queremos añadir validaciones adicionales antes de hacer el login, como por ejemplo, que el estado del usuario sea Activo, lo podemos hacer en el método validatePassword de LoginForm:
    public function validatePassword($attribute, $params)  {
        if (!$this->hasErrors()) {
            $user = $this->getUser();
 
            if (!$user || !$user->validatePassword($this->password)) {
                $this->addError($attribute, 'Usuario o password incorrecto');
            } else
		if($user->estado!="A")
			$this->addError($attribute, 'Usuario inactivo o no confirmado');
        }
    }

Al hacer estos cambios, Yii::$app→user→identity es una instancia de la clase Usuarios, y podemos utilizar cualquier propiedad de ésta en los menús, las vistas, controladores y modelos. En views\layouts\main.php se hace referencia a la propiedad username de User, por lo que habrá que cambiarla por la que queramos de nuestra clase Usuarios (usuario, nombre, etc…)