这是我设置密码的方式:
$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;
}
如果密码没有哈希,那么一切都会正常工作。好吧,就我而言,密码是经过哈希处理的,我不知道如何解决这个问题。
我很困惑,任何帮助都会非常感激!
答案 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
,因为false
是boolean
,在这种情况下返回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;
}