Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Logar Usuario

Boa tarde, agradeceria ajuda. Preciso para logar o usuário comparar sua senha com a cadastrada no banco de dados que utiliza hash.. O problema é que não sei como fazer para comparar as senhas e validar o usuário. O var_dump na query retorna:

string(74) "select * from perfil where email='pugui@pugui.com.br' and senha='123'"

e depois não compara e autentica o usuário.

segue o que tentei até o momento:

index.php

<form action="php/login.php" method="post">
        <div class="form-group">
          <input class="form-control" type="text" name="login" placeholder="Login" required>
        </div>

        <div class="form-group">
          <input class="form-control" type="password" name="senha" placeholder="Senha" required>
        </div>

        <div class="form-group">
          <input type="submit" class="btn btn-primary"  value="Login">
        </div>
      </form>

login.php

$usuario = buscaUsuario($conexao, $_POST["login"], $_POST["senha"]);

//var_dump($usuario);exit;

if (password_verify($senha_base, $senha)) {

   header("Location: ../index.php?login=0");
   } else {
    logarUsuario($usuario["login"]);
  header("Location: ../index.php?login=1");
  }

banco-usuario.php

<?php
function buscaUsuario($conexao, $login, $senha_base)
{
    $login = mysqli_real_escape_string($conexao, $login);
    $query = "select * from perfil where email='{$login}'
    and senha='{$senha_base}'";
    //var_dump($query);exit;
        $resultado = mysqli_query($conexao, $query);
        $usuario = mysqli_fetch_assoc($resultado);
        return $usuario;
    }

primeiro-perfil.php

class Primeiroperfil
{
    public $id;
    public $nome;
    public $sobrenome;
    public $email;
    public $senha;


    public function __construct()
    {
    }


    public function getId()
    {
        return $this->id;
    }
    public function setId($id)
    {
        $this->id = $id;
    }

    public function getNome()
    {
        return $this->nome;
    }
    public function setNome($nome)
    {
        $this->nome = $nome;
    }

    public function getSobrenome()
    {
        return $this->sobrenome;
    }
    public function setSobrenome($sobrenome)
    {
        $this->sobrenome = $sobrenome;
    }

    public function getEmail()
    {
        return $this->email;
    }
    public function setEmail($email)
    {
        $this->email = $email;
    }

    public function getSenha()
    {
        return $this->senha;
    }

    public function setSenha($senha)
    {
        $senha_base = password_hash($senha, PASSWORD_DEFAULT);


        $this->senha = $senha_base;
    }
}
5 respostas

Olá, Sérgio.

Na hora de buscar o usuário, você não compara a senha. Ou seja, sua query ficaria:

$query = "select * from perfil where email='{$login}';";

Isso porque a senha no banco é a cifrada. Ao recuperar o usuário, você utiliza o password_verify para garantir que a senha cifrada bate com a que você recebeu em texto puro.

Então, mudar a query deve resolver seu problema.

Agora, já que você está lidando com assuntos de segurança, recomendo utilizar PDO e prepared statements para fazer suas queries. Forte abraços e bons estudos!

Obrigado Vinicius entendi. Eu não comparo a busca no banco e sim o resultado dela. Desta forma alterei o banco-usuario mas não deu certo. Ele não fez a comparação. Na verdade acho que não estou conseguindo fazer a comparação no password_verify talvez porque não consigo definir a senha que vem do banco e a senha que vem do formulário. Você poderia me ajudar?

function buscaUsuario($conexao, $login, $senha_base)
{
    $login = mysqli_real_escape_string($conexao, $login);
    $query = "select * from perfil where email='{$login}';";

    if (password_verify($senha_base, $senha)) { 

        $resultado = mysqli_query($conexao, $query);


        $usuario = mysqli_fetch_assoc($resultado);

        //var_dump($usuario);exit;

        return $usuario;
    }
}
solução!

Sérgio, se você não tivesse alterado sua função buscaUsuario provavelmente funcionaria. Mantém seu código antigo, mudando só a query.

login.php:

$usuario = buscaUsuario($conexao, $_POST["login"], $_POST["senha"]);

if (password_verify($_POST["senha"], $usuario['senha'])) {
    header("Location: ../index.php?login=0");
} else {
    logarUsuario($usuario["login"]);
    header("Location: ../index.php?login=1");
}
function buscaUsuario($conexao, $login)
{
    $login = mysqli_real_escape_string($conexao, $login);
    $query = "select * from perfil where email='{$login}'";

    $resultado = mysqli_query($conexao, $query);
    $usuario = mysqli_fetch_assoc($resultado);
    return $usuario;
}

Oi Vinicius obrigado pelas dicas, funcionou certinho. abraços.

Show de bola, Sérgio. Não esquece de dar uma olhada em PDO e Prepared Statements depois.

;-)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software