Foros del Web » Programando para Internet » PHP » Symfony »

[SOLUCIONADO] Comparar contraseña encriptadas login

Estas en el tema de Comparar contraseña encriptadas login en el foro de Symfony en Foros del Web. Hola. Soy nuevo en el foro y en Symfony, he esta buscando un tema relacionado con el mio, pero hay tantos que ya estoy mareado. ...
  #1 (permalink)  
Antiguo 29/01/2016, 05:34
 
Fecha de Ingreso: enero-2016
Mensajes: 15
Antigüedad: 8 años, 2 meses
Puntos: 0
Comparar contraseña encriptadas login

Hola.
Soy nuevo en el foro y en Symfony, he esta buscando un tema relacionado con el mio, pero hay tantos que ya estoy mareado.
He seguido los videos de http://www.cesarcancino.com/ y http://www.edsonmm.com/curso-de-symfony-2/.
En uno crea los usuarios encriptando la clave, y guardándola con Doctrine en una BBDD. La idea es hacer una autentificacion por script, no como lo trae el manual de symfony por cortafuego.
La crea de esta forma:
UserController
Código PHP:
 public function createAction(Request $request)
        {
            
$user = new User();
            
$form=$this->createCreateForm($user);
            
$form->handleRequest($request);
    
           if(
$form->isValid())
            {
                
$password $form->get('password')->getData();
                
                
$passwordConstraint = new AssertNotBlank();
                
$errorList $this->get('validator')->validate($password$passwordConstraint);
                
                if(
count($errorList) == 0)
                {
                     
                    
$encoder $this->container->get('security.password_encoder');
                    
$encoded $encoder->encodePassword($user$password);
                   
                    
$user->setPassword($encoded);
                   
                    
$em $this->getDoctrine()->getManager();
                    
$em->persist($user);
                    
$em->flush(); 
Pero al hacer la Action del Login(ya en el Login), no consigo encriptar la clave introducida en este, para compararla con la clave guardada en la BBDD. Me salen siempre distinta.

DefaultController.php

Código PHP:
     public function loginAction(Request $request)
    {
        
        if(
$request->getMethod()=="POST")
        {
            
$email=$request->get("correo");
            
$password=$request->get("pass");
            
//echo "correo=".$correo."<br>pass=".$pass;exit;
            
$user=$this->getDoctrine()->getRepository('bdBundle:Usuarios')->findOneBy(array("correo"=>$email,"pass"=>$password));
            if(
$user)
            {
               
$session=$request->getSession();
               
$session->set("id",$user->getId());
               
$session->set("nombre",$user->getNombre());
               
//echo $session->get("nombre");exit;
               
return $this->redirect($this->generateUrl('bd_homepage'));
            }else
            {
                 
$this->get('session')->getFlashBag()->add(
                                
'mensaje',
                                
'Los datos ingresados no son válidos'
                            
);
                    return 
$this->redirect($this->generateUrl('bd_homepagelogin'));
            }
        }
        
        return 
$this->render('bdBundle:Trabajo:login.html.twig');
    } 
Esta funciona perfectamente sin los password encriptado, no se como encriptar $password.
lo he intentado asi:
Código PHP:
            $email=$request->get("username");
            
$password=$request->get("password");
            
$user=$this->getDoctrine()->getRepository('userBundle:User')->findOneBy(array("username"=>$email));
            
//print_r($user);exit;
            
$encoder $this->container->get('security.password_encoder');
            
$encoded $encoder->encodePassword($user$password); 
La verdad es que no comprendo muy bien el funcionamiento de encodePassword

Saludos.
  #2 (permalink)  
Antiguo 29/01/2016, 05:52
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 14 años, 7 meses
Puntos: 13
Respuesta: Comparar contraseña encriptadas login

La contraseña del usuario al registrarse se guarda encriptada por lo tanto tienes que buscar en la DB el usuario por el username o email y a posteriori comparar que la password plana que te da el supuesto usuario, codificandola es igual que la que sacas de la DB.
  #3 (permalink)  
Antiguo 29/01/2016, 11:35
 
Fecha de Ingreso: enero-2016
Mensajes: 15
Antigüedad: 8 años, 2 meses
Puntos: 0
Respuesta: Comparar contraseña encriptadas login

Gracias Borja por responder.
Eso es precisamente lo que no me sale bien.
En el ultimo parrafo es lo que intento, cuando se da de alta lo hace de esta forma:
Código PHP:
 $encoder $this->container->get('security.password_encoder'); 
         
$encoded $encoder->encodePassword($user$password); 
Con el usuario que le viene en el form, se lo pasa a la función encodePassword junto el password, crea un password codificado se lo pone al objeto user:
Código PHP:
 $user->setPassword($encoded); 
y lo guarda en la BBDD
Código PHP:
$em $this->getDoctrine()->getManager(); 
                    
$em->persist($user); 
                    
$em->flush(); 
el problema lo tengo en el login que no se como, solo con el username o email, me da igua y el password, pasarlo por encodePassword y que me de el mismo password que esta guardado en la BBDD. lo he probado y me da distinto, tiene que haber un paso intermedio que se me escapa.
En esas estamos
Gracias Saludos Luis.
  #4 (permalink)  
Antiguo 30/01/2016, 08:16
 
Fecha de Ingreso: enero-2016
Mensajes: 15
Antigüedad: 8 años, 2 meses
Puntos: 0
Respuesta: Comparar contraseña encriptadas login

Hola.
He observado, que creando el mismo usuario varias veces, con los mismos datos y el mismo password, crea un password encriptadp distinto.
En la pagina https://www.dailycred.com/article/bcrypt-calculator
Uso el mismo pasword y me da distintos resultado también.
El método de encriptacion es
Código PHP:
encoders:
        
inventariouserBundleEntityUser:
            
algorithmbcrypt
            cost
12 
¿Por que?
[URL="https://en.wikipedia.org/wiki/Bcrypt"]https://en.wikipedia.org/wiki/Bcrypt[/URL]
Pensaba que el chorizo era la clave y el "sal" era algo interno de la entidad User.
Mi idea era coger el password guardado en el registro y generar uno igual y comparar
Código PHP:
$encoder $this->container->get('security.password_encoder');
$encoded $encoder->encodePassword($user$password);
$user=$this->getDoctrine()->getRepository('userBundle:User')->findOneBy(array("username"=>$username,"password"=>$encoded)); 
Esto no iba a ningún lado, cada vez que se encripta se crea un "chorizo nuevo", por lo que siempre son distintos.

No era tan complicado.
Con esta función se solucionaba:
Código PHP:
if (password_verify($password$user->getPassword())) 
Se le pasa el password del formulario, sin codificar y el password que tenemos en la BBDD(este esta codificado). El solo saca el "sal" del guardado, hace la codificación con el password del login y compara los resultados.
Saludos Luis

Etiquetas: contraseña, login
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:31.