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
相关产品推荐
相关产品推荐

