在 Laravel 中优化密码重置令牌的搜索

Optimizing search for password reset token in Laravel

我正在使用 Laravel v9。我知道 Laravel 提供了一个默认的密码重置流程,但我没有使用它,因为我想要一个自定义的路由名称。所以我在写我自己的流程。

我希望它具有与 Laravel 提供的类似的安全级别。我观察到 Laravel 正在对他们数据库中的密码重置令牌进行哈希处理。据我了解,这是一种安全措施,用于防止除用户帐户所有者以外的任何人未经所有者同意重置帐户密码(就像散列帐户密码一样)。

当用户请求重置其帐户密码时,带有令牌的 link 将发送至其注册的电子邮件地址。 link 将用户定向到重置其帐户密码的页面。在页面显示之前,我的系统会检查令牌是否存在:

  1. 检索所有 table 条记录
  2. 遍历所有记录并使用Hash::check()将每个记录令牌与传入请求令牌进行比较
  3. 如果找到令牌,则显示页面。否则,return一个错误404页面

我意识到这可能是一个潜在的性能问题:如果在短时间内有很多用户请求重设密码,那么第 2 步在时间复杂度和内存使用方面都是一项密集型任务。有什么方法可以比较数据库查询而不是应用程序循环中的令牌值,因为一般数据库查询在速度方面更快?

也许我遗漏了什么,但简单的解决方案似乎是在 URL 中将用户名或 ID 与令牌一起包含在内。然后检查页面将:

  1. 在数据库中查找指定用户
  2. 检查它是否存在,并且有一个有效的重置令牌
  3. 对照 URL
  4. 中的令牌检查数据库中的令牌
  5. 如果所有检查都通过,则允许重设密码