Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Lanzar Formulario "cambio de contraseña" al iniciar sesión Symfony2

19 de enero de 2016

Estimados, Espero estén bien.

Quiero hacer lo siguiente pero no sé dónde hacerlo.

El administrador al restaurar la contraseña del usuario esta se setea en "123456" en texto plano. Lo que debo hacer es que cada vez que al iniciar sesión, si la contraseña es '123456' me debe redirigir al formulario de cambio de contraseña, y que no me deje avanzar ni entrar a ninguna pagina si no la ha cambiado. Una vez cambiada, debe volver a loguear con la nueva contraseña.

Les comento que no uso FosUserBundle porque no estoy trabajando con Doctrine ORM, sino que con DBAL, puesto que la base de datos no me pertenece, y solamente tengo acceso a hacer un update a la tabla usuario para guardar la nueva contraseña, pero esta vez encriptada.

Tengo todo el proceso de login funcionado. Si el usuario tiene una contraseña sin encriptar "123456", la aplicación la encripta y continua con el login, pero ahora necesito que me redirija al formulario de cambio de contraseña, y no sé donde debo meter mano.

espero me puedan ayudar. Les dejo el método de ejemplo de mi Proveedor de usuario personalizado que tengo:

public function findByUsername($username)
    {
        $id = $username;
        /* Arreglo que contiene las columnas a obtener en la consulta */
        $colSelect = array(
            'id_rut',
            'id_pass',
            'id_bloq',
            'id_fun_cambiaclave',
        );
 
        /* Instanciado de QueryBuilder y construcción de la consulta */
        $qb = $this->ae->createQueryBuilder()
                ->select($colSelect)
                ->from('id_fun')
                ->where('id_rut = ?')
                ->setParameter(0,$id);
 
        /* Ejecución de la consulta y obtención de los datos */
        $stmt = $qb->execute();
        $datos = $stmt->fetch();
 
        if(!$datos) {return null;}
 
        /* Creación de las variables necesarias para instanciar un nuevo Usuario */
        $password       = $datos[$colSelect[1]];
        $bloqueado      = $datos[$colSelect[2]];
        $cambiaClave    = $datos[$colSelect[3]];
        $roles          = array('ROLE_PERSONAL');
 
        $repo = $this->ae->getRepositorio('Personal');
        $personal = $repo->findByRut($id);
 
        if(!$personal) {return null;}
 
        /* Intanciado del nuevo Usuario a retornar */
        $usuario = new Usuario($id, $personal, $username, $password, $roles, $bloqueado, $cambiaClave);
 
        /* Si el password es 123456 (el por defecto) se codifica y se setea el 
         * cambio de clave a true */
        if ($usuario->getPassword() == '123456')
        {
            $usuario->setPassword($this->encoder->getEncoder($usuario)->encodePassword('123456', $usuario->getSalt()));
            $usuario->setCambiaClave(true);
        }
 
        return $usuario;
    }

De antemano muchas gracias. Saludos.


Respuestas

#1

Hola:

Lo que puedes hacer es meter un listener del tipo onKernelRequest, que compruebe si el usuario logueado tiene pendiente el cambio de contraseña y si intenta acceder a cualquier URL que le redireccione a la ruta que cargue el formulario correcto.

Yo hice un listener que si hay un parámetro en base de datos, te bloquea la web, excepto si el usuario es ROOT. Quizás te sirva para ver como hay que hacerlo: Te pongo la url al pastebin para que lo veas con comodidad.

Quizas no te de la respuesa completa, pero creo que con esto tendras por donde tirar.

edito:

La clave está en método onKernelRequest que se ejecuta en cuanto el usuario hace la petición y antes de que se resuelva la URL. Lo que tendrías que poner, seria verificar si el usuario que está logueado tiene el parametro setCambioContraseña a true (o como se llame en tu caso) y si lo está redireccionar siempre a la plantilla en la que tengas el formulario cuya función sea cambiar la contraseña.

Un saludo

@TsubasaAkai

20 enero 2016, 0:08
#2

Ohhh, genial. Muchas gracias. Ahora sí ya sé por donde darle una vuelta.

Estudiaré tu listener para ver como lo aplico en mi caso. Nuevamente muchas gracias. Les comento como me va.

Saludos desde Chile.

@SebaRiquelmeP

20 enero 2016, 0:17
#3

Espero que te sea de ayuda, con lo que sea ponlo en el pastebin y asi veo como lo has solucionado.

Un saludo.

@TsubasaAkai

20 enero 2016, 0:20
#4

Listo, muchas gracias por la ayuda.

Efectivamente lo he solucionado a través de un listener. Tuve problemas porque entraba en un loop, pero lo solucioné con un par de validaciones, además de hacer que funcione en modo dev.

Les dejo el pastebin por si a alguien más les sirve.

Saludos desde Chile y nuevamente muchas gracias.

@SebaRiquelmeP

21 enero 2016, 23:50