哈希密码和createQueryBuilder()

时间:2017-02-19 22:59:35

标签: php doctrine-orm symfony

这是我设置密码的方式:

$member->setPassword(password_hash($_POST['pw1'], PASSWORD_DEFAULT));

要检查密码是否正确,我只需使用以下代码:

if(password_verify($password, $hashed_pw)) { // $hashed_pw is not set, since this is just an example
    // Do something here
}

到目前为止一切都很好。

问题

我正在使用此方法构建查询:

private function getData($username, $password) {
    // Getting the data
    $query = $this->getDoctrine()->getRepository('AppBundle:Members')
        ->createQueryBuilder('t')
        ->where('t.email = :email')
        ->andWhere('t.password = :password')
        ->setParameter('email', $username)
        ->setParameter('password', $password)
        ->getQuery();
    $result = $query->getResult();

    // Get the name
    $name = $result[0]->getName();

    // Check if query exists
    $result = ($result) ? $name : false;
    return $result;
}

如果密码没有哈希,那么一切都会正常工作。好吧,就我而言,密码是经过哈希处理的,我不知道如何解决这个问题。

我很困惑,任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:1)

以下是我的回答:

private function verifyUser($username, $password) {
    $em = $this->getDoctrine()->getManager();
    $qb = $em->createQueryBuilder();
    $qb->select('m')
        ->from('AppBundle:Members', 'm')
        ->where('m.email = :email')
        ->andWhere('m.password = :password')
        ->setParameter('email', $username)
        ->setParameter('password', $password)
    ;
    $member = $qb->getQuery()->setMaxResults(1)->getOneOrNullResult();

    if( $member == null ) {
        $result = null;
    }
    else{
        $result = $member->getName();
    }

    return $result;
}

说明:将您的函数重命名为verifyUser,因为它是所做的。正如您所看到的,我已经制作了代码,以便当开发人员阅读它时,它应该是有意义的,如果您将来必须更改代码,它将更容易支持。

我获取EntityManager并创建一个QueryBuilder,然后创建一个查询设置电子邮件&密码。请注意,我致电getOneOrNullResult重要。如果没有得到结果(null),那么传入的密码与存储的密码不匹配,这不是用户。

我还将setMaxResults设置为 1 ,只应返回 1 结果(如果匹配),因为您应该只有一个用户拥有此密码(希望你的设计就是这种情况 - 如果没有,你需要重新考虑设计)。

然后我查看$member,它是一个成员,如果不匹配则为null,并设置$result分别返回。

我使用null作为返回值而不是false,因为falseboolean,在这种情况下返回null更好的设计

希望一切都有道理。

编辑#2 - 合并密码哈希

private function verifyUser($username, $password) {
    $em = $this->getDoctrine()->getManager();
    $qb = $em->createQueryBuilder();
    $qb->select('m')
        ->from('AppBundle:Members', 'm')
        ->where('m.email = :email')
        ->setParameter('email', $username)
    ;
    $member = $qb->getQuery()->setMaxResults(1)->getOneOrNullResult();

     if( password_verify($password, $member->getPasswordHash()) ){
        $result = $member->getName();
    }
    else{
        $result = null;
    }

    return $result;
}

上述方法假设您在成员实体中存储了密码哈希,然后使用函数getPasswordHash()得到它。

答案 1 :(得分:0)

没关系,我只回答我自己的问题。我只需要创建另一个查询:

private function getData($username, $password) {

    // Get the PW
    $query_pw = $this->getDoctrine()->getRepository('AppBundle:Members')
        ->createQueryBuilder('m')
        ->where('m.email = :email')
        ->setParameter('email', $username)
        ->getQuery();
    $result_pw = $query_pw->getResult();

    if ($result_pw) {
        $hashed_pw = $result_pw[0]->getPassword();
    }
    else {
        $hashed_pw = false;
    }

    // Getting the data
    $query = $this->getDoctrine()->getRepository('AppBundle:Members')
        ->createQueryBuilder('t')
        ->where('t.email = :email')
        ->andWhere('t.password = :password')
        ->setParameter('email', $username)
        ->setParameter('password', $hashed_pw)
        ->getQuery();
    $result = $query->getResult();

    // Verify the password
    if(password_verify($password, $hashed_pw)) {
        // Get the name
        $name = $result[0]->getName();
    }
    else {
        $name = false;
    }

    // Check if query exists
    $result = ($result) ? $name : false;
    return $result;
}