Contraseña de usuario en Symfony

Hola, tengo configurado un entity provider para que cargue los usuarios de mi aplicación desde mi base de datos. Cuando un nuevo usuario se registra codifico su contraseña mediante el siguiente código:

$plainPassword = $form->get('password')->getData();
$encoder = $this->container->get('security.password_encoder');
$encoded = $encoder->encodePassword($usuario, $plainPassword);
$usuario->setPassword($encoded);

Hasta aquí todo correcto, mis usuarios acceden a la aplicación con su username y password y en la base de datos el campo password aparece codificado.

Tengo una sección donde se le permite al usuario cambiar su contraseña, pero no sé como obtener el password en texto plano (el password que introdujo el usuario al registrarse) para poder cambiarla ya que se le pide al usuario que introduzca su contraseña actual antes de poder cambiarla.

En security.yml el encoder que utilizo es:

encoders:
        UsersBundle\Entity\Usuario: 
            algorithm: bcrypt
            cost: 12

Respuestas

#1

Hola, Almacenar el password en texto plano es una falla de seguridad y de ninguna manera deberías hacerlo, en estos casos lo que se hace es lo siguiente:

En tu formulario de cambiar la contraseña debes adicionar un campo current_password con la opción mapped con valor false, o sea que ese campo realmente no pertenece a la entidad User y lo que haces es adicionarle a ese campo un Validator del Core de Symfony UserPasswordValidator que se encarga de verificar con el tokenStorage si el password que estás ingresando en el campo es igual al del usuario actual y en caso contrario te devuelve el form mostrando el error.

Aquí te dejo como maneja este tema FOSUserBundle desde su formulario de ChangePasswordFormType

Luego de que envies el form recuerda convertir tu plainPassword con el encoder como muestras en tu código, normalmente FOSUser lo que hace es que llamar métodos que hacen este trabajo

$this->updateCanonicalFields($user);
        $this->updatePassword($user);
 
        $this->objectManager->persist($user);
 
        if ($andFlush) {
            $this->objectManager->flush();
       }

Espero que te ayude la respuesta y en cualquier caso deja un mensaje por acá para saber si te sirve o no. Saludos