【问题标题】:Using $hash for the method setParameter()对 setParameter() 方法使用 $hash
【发布时间】:2019-09-12 10:36:30
【问题描述】:

我想知道用户是否登录。

public function findByExampleField($data) {
    return $this->createQueryBuilder('u')
        ->select('u.email, u.password')
        ->where('u.email = :email')
        ->andWhere('u.password = :password')
        ->setParameter('email', $data['email'])
        ->setParameter('password', $data['password']) // <-- the problem
        ->setMaxResults(10)
        ->getQuery()
        ->getResult()
    ;
}

由于密码是散列的,我需要先验证它。在这种情况下,我需要使用password_verify($data['password'], $hash)。我的问题是第二个参数。如何声明变量$hash

【问题讨论】:

  • 如下所述,去掉-&gt;andWhere('u.password = :password')-&gt;setParameter('password', $data['password']),然后在PHP中运行比较逻辑。 -&gt;setMaxResults(10) 也很有趣!
  • 只是好奇,你为什么用密码搜索?在您的数据库中,电子邮件不是唯一的吗?通过其他字段而不是密码可能更容易搜索?

标签: php symfony authentication symfony4


【解决方案1】:

不可能通过哈希搜索。

password_hash 生成的哈希是唯一的,每次都包含一个随机盐。

连续调用password_hash 会产生不同的结果。这很容易通过以下方式验证:

var_dump(password_hash('1', PASSWORD_DEFAULT) == password_hash('1', PASSWORD_DEFAULT));
// bool(false)

您可以password_verify 哈希,因为它包含所有必要的信息(哈希+盐+算法),但重新生成相同的哈希以在数据库中查找它是不可能的。

基本上你试图做的不仅是一个坏主意,而且是不可能的。

您所做的是通过用户名或电子邮件(无论您对用户拥有什么唯一标识符)获取用户,然后验证密码:

$user = $userRepository->findUserByEmail($email);

$loggedIn = password_verify($inputPassword, $user->getPassword());

【讨论】:

    【解决方案2】:

    获取用户并放弃密码的 WHERE 子句。然后你可以得到哈希密码并在PHP中检查它。

    而且我猜你每个电子邮件地址不会超过一行,所以你也可以放弃 MaxRecords。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-28
      • 2022-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      相关资源
      最近更新 更多