You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5.5:通过哈希令牌从resetpasswordlog表获取用户邮箱

解决Laravel 5.5自定义密码重置日志表的令牌匹配问题

兄弟,你踩了bcrypt哈希的一个常见坑——它每次生成哈希值时都会自动添加随机盐,所以同一个明文令牌,每次调用Hash::make($token)得到的结果都不一样,这就是你匹配不上数据库记录的原因!

正确的做法不是重新哈希令牌去对比,而是用Laravel提供的Hash::check()方法,它会自动提取存储在哈希值里的盐,用相同的盐重新哈希明文令牌,再和数据库里的记录做对比。

具体实现步骤

  1. 理解核心逻辑
    数据库resetpasswordlog表中存储的是令牌的哈希值,而你拿到的$token是原始明文令牌。验证时必须用Hash::check($明文令牌, $数据库中的哈希值)来判断是否匹配,而不是生成新的哈希值去对比。

  2. 修改用户模型的通知方法
    替换你当前的sendPasswordResetNotification方法,通过Hash::check找到对应的记录,再获取邮箱发送自定义邮件:

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;

public function sendPasswordResetNotification($token) {
    // 从自定义表中查找匹配的重置记录
    $resetRecord = DB::table('resetpasswordlog')
        ->get()
        ->filter(function($item) use ($token) {
            // 用Hash::check验证令牌是否匹配
            return Hash::check($token, $item->token);
        })
        ->first();

    if ($resetRecord) {
        // 获取目标用户邮箱
        $userEmail = $resetRecord->email;

        // 自定义邮件发送逻辑(这里替换成你的邮件模板和内容)
        Mail::send(
            'emails.custom_password_reset', // 你的邮件视图
            ['resetToken' => $token], // 传递给视图的数据
            function($message) use ($userEmail) {
                $message->to($userEmail)
                        ->subject('你的密码重置请求');
            }
        );
    }
}
  1. 优化查询(可选)
    上面的代码会遍历全表记录做验证,如果你想提升效率,可以结合其他条件(比如用户ID、邮箱有效期)缩小查询范围,例如:
$resetRecord = DB::table('resetpasswordlog')
    ->where('email', $this->email) // 假设用户模型有email字段,先限定当前用户的记录
    ->where('created_at', '>=', now()->subMinutes(60)) // 只查60分钟内的有效记录
    ->get()
    ->filter(function($item) use ($token) {
        return Hash::check($token, $item->token);
    })
    ->first();
  1. 确保表字段长度正确
    一定要保证resetpasswordlog表的token字段长度足够(建议VARCHAR(255)或TEXT),因为bcrypt生成的哈希值大概是60个字符,避免字段截断导致验证失败。

内容的提问来源于stack exchange,提问作者Niladri Banerjee - Uttarpara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:59:53