Jump to content

(SOLUCIONADO) Encriptación de contraseña de empleados en Prestashop 1.7


Recommended Posts

¡Hola a tod@s!

Estoy tratando de hacer un login en un módulo con Prestashop 1.7.x, y neecesito comprobar que la contraseña que introduce el empleado coincide con la contraseña encriptada guardada en la base de datos de la tienda.

El proceso que tengo que seguir es:

  • El empleado elige su email (su cuenta) en un menú desplegable.
  • El empleado introduce su contraseña.


Una vez elegido su email e introducido su contraseña, obtengo de la base de datos su contraseña encriptada (filtro por id la tabla ps_employee), y trato de encriptar la contraseña (en texto plano) que ha introducido.

AQUÍ ESTÁ EL PROBLEMA: no consigo encriptar la contraseña igual que lo hace Prestashop 1.7 para luego compararla con la almacenada en la base de datos a ver si son iguales.

En Prestashop 1.6 se podía encriptar con Tools::encrypt($la_contraseña_en_texto_plano), pero en Prestashop 1.7 parece que no es tan sencillo.

La contraseña almacenada en la base de datos es del tipo:

$2y$10$cu17NZHEaIy0qNGYt189Ou1hQjDa7p6UoTCsnPNtwgGWuhvUYT2LG

He probado la nueva función que trae Prestashop 1.7 Tools:hash($la_contraseña_en_texto_plano), pero lo que devuelve es algo así:

8fdf18d292d6922c041713356061e06b

Y lo mismo con hashIV(), etc.. de la clase Tools.

Según he leido, es que ahora la encriptación está basada en Symfony, pero he intentado lo siguiente, y aunque la contraseña es parecida, no coincide con la de la base de datos:

  public static function crypto($plaintextPassword)
  {
    /** @var \PrestaShop\PrestaShop\Core\Crypto\Hashing $crypto */
    $crypto = PrestaShop\PrestaShop\Adapter\ServiceLocator::get('\\PrestaShop\\PrestaShop\\Core\\Crypto\\Hashing');
    $passwd = $crypto->hash($plaintextPassword);

    return $passwd;
  }

Esto cada vez me devuelve una contraseña cifrada diferente, aunque le pase el mismo $plaintextPassword.

¿Alguien sabe cómo solucionarlo?

 

¡Muchas gracias de antemano!
oddworldng.

 

Edited by oddworldng (see edit history)
Link to comment
Share on other sites

Bueno, me respondo a mi mismo, espero que esto le pueda ser útil a alguien más ...

Es más sencillo de lo que pensaba, como era de esperar.

He desarrollado esta función, que compara la contraseña introducida en texto plano por el empleado con la contraseña almacenada en la base de datos y devuelve true si coinciden y false si no:

  public static function crypto($plaintextPassword, $passwordHash)
  {
    /** @var \PrestaShop\PrestaShop\Core\Crypto\Hashing $crypto */
    $crypto = PrestaShop\PrestaShop\Adapter\ServiceLocator::get('\\PrestaShop\\PrestaShop\\Core\\Crypto\\Hashing');

    return $crypto->checkHash($plaintextPassword, $passwordHash);
  }

 Y para llamar a esta función hago:

/* Inserted form password */
$plaintextPassword = Tools::getValue('input_password');
/* Selected employee stored password */
$passwordHash = $this->db->getEmployeePassword($id_employee)[0]['passwd'];
dump($this->crypto($plaintextPassword, $passwordHash));

if ($this->crypto($plaintextPassword, $passwordHash)) {
	$output .= $this->displayConfirmation($this->l('Login successful'));
} else {
	$output .= $this->displayError($this->l('ERROR').': '.$this->l('Password incorrect'));
}

Y la función que hice para obtener la contraseña del empleado es:

 

  public function getEmployeePassword($id_employee)
  {
    return(
      Db::getInstance()->executeS('
        SELECT `passwd`
        FROM '._DB_PREFIX_.'employee
        WHERE `id_employee`='.(int)$id_employee.'
        LIMIT 1
      ')
    );
  }

 

En resumen, que utilizando $crypto->checkHash($plaintextPassword, $passwordHash), ya me compara ambas contraseñas.

NOTA: me he inspirado en el código que hay en el fichero /classes/Customer.php, en la función getByEmail().

Un saludo,

oddworldng.

Link to comment
Share on other sites

  • nadie locked this topic
Guest
This topic is now closed to further replies.
×
×
  • Create New...