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

Laravel 12密码重置提交新密码后无法更新用户密码的问题求助

Laravel 12密码重置提交新密码后无法更新用户密码的问题求助

各位大佬好,我现在在做Laravel 12的密码重置功能,遇到了一个卡壳的问题,想请大家帮忙看看:

流程前面都正常——忘记密码页输邮箱,能收到带重置链接的SMTP邮件,点链接也能进到重置密码页(页面只有新密码输入框和提交按钮)。但一旦输入新密码点提交,页面就只是刷新,既不跳登录页,也没任何成功/错误提示,而且数据库users表里的密码完全没更新——用新密码登不上,旧密码还能用。

提交后URL变成了这样:
127.0.0.1:8000/reset-password?token=iIThgho95IZSHgkDAHTcsSWVAnPkUf7WgbERFFHKzHPz5Wvuib3zV4qNU5Rtrnc2&email=qwerty07%40gmail.com&password=qwerty123

下面是我相关的代码:

路由配置

// 密码重置路由
Route::get('/reset-password', [ResetPasswordController::class, 'showResetForm'])->name('password.reset');
Route::post('/reset-password', [ResetPasswordController::class, 'reset'])->name('password.update');

重置密码页面的Blade模板

<h2 style="font-family: Arial; text-align: center;">Reset Password</h2>
<form method="POST" action="{{ route('password.update') }}" style="max-width: 400px; margin: auto; padding: 20px; border: 1px solid #ccc; border-radius: 8px;">
    @csrf
    <input type="hidden" name="token" value="{{ $token }}">
    <input type="hidden" name="email" value="{{ $email }}">
    <label style="display: block; margin-bottom: 5px;">New Password:</label>
    <input type="password" name="password" required style="width: 100%; padding: 10px; margin-bottom: 15px; border: 1px solid #ccc; border-radius: 4px;">
    <button type="submit" style="width: 100%; padding: 10px; background-color: #4CAF50; color: white; border: none; border-radius: 4px;">
        Reset Password
    </button>
</form>

ResetPasswordController的reset方法代码

public function reset(Request $request)
{
    // 验证输入
    $request->validate([
        'email' => 'required|email|exists:users,email',
        'password' => 'required|min:3',
        'token' => 'required'
    ]);

    // 查询重置令牌
    $tokenData = DB::table('password_resets')
        ->where('email', $request->email)
        ->where('token', $request->token)
        ->first();

    if (!$tokenData) {
        return back()->withErrors(['email' => '无效的令牌或邮箱。']);
    }

    // 检查令牌是否过期
    if (Carbon::parse($tokenData->created_at)->addMinutes(60)->isPast()) {
        return back()->withErrors(['email' => '令牌已过期。']);
    }

    // 查找用户并更新密码
    $user = User::where('email', $request->email)->first();
    if (!$user) {
        return back()->withErrors(['email' => '未找到该用户。']);
    }

    $user->password = Hash::make($request->password);
    $user->save();

    \Log::info('密码重置成功,用户邮箱: ' . $request->email);

    // 删除已使用的令牌
    DB::table('password_resets')->where('email', $request->email)->delete();

    // 跳转到登录页并提示成功
    return redirect('/login')->with('status', '密码已重置成功!');
}

我已经检查了password_resets表,令牌是存在的,而且没过期。控制器里加了日志,但奇怪的是日志里并没有那条密码重置成功的记录,说明可能控制器的reset方法根本没被执行?但为什么页面会刷新成带参数的GET请求呢?

有没有大佬能帮我找出问题出在哪?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 07:40:34