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

Laravel密码修改失败:控制器接收请求但无法保存新密码求助

Laravel密码修改无法保存问题修复

问题概述

我基于Laravel编写了密码修改控制器函数,逻辑为验证旧密码与系统存储密码匹配后替换为新密码。已通过dd($request)确认控制器能接收请求,但新密码始终无法保存,相关代码如下:

控制器代码

public function update_password (Request $request)
{
    // dd($request);
    $request->validate([
        'oldpassword' => ['required','string','min:8'],
        'newpassword' => ['required', 'string', 'min:8', 'confirmed']
    ]);

    $currentPasswordStatus = Hash::check($request->oldpassword, auth()->user()->password);
    if($currentPasswordStatus){

        User::findOrFail(Auth::user()->id)->update([
            'password' => Hash::make($request->newpassword),

        ]);

        dd($request->password);
        return redirect()->route('profile')->with('message','Password Updated Successfully');

    }else{

        return redirect()->back()->with('message','Current Password does not match with Old Password');
    }
}

路由配置

Route::post('update_password', [\App\Http\Controllers\Auth\RegisteredUserController::class, 'update_password'])->name('change_password');
Route::get('update_password',[\App\Http\Controllers\Auth\RegisteredUserController::class, 'edit_password'])->name('edit_password');

表单代码

<div class="row g-7">
    <form class="box" style="top: 50rem" method="POST" action="{{ route('change_password') }}">
        @csrf
        <div>
            <label class="font-italic mb-1" style="padding: 1rem">Enter Old Password:</label>
            <span><input id="password" class="block mt-1 w-full" type="password" name="oldpassword" required /></span>
        </div>

        <div>
            <label class="font-italic mb-1" style="padding: 1rem">Enter New Password:</label>
            <span><input id="password" class="block mt-1 w-full" type="password" name="newpassword" required /></span>
        </div>

        <div>
            <label class="font-italic mb-1" style="padding: 1rem">Confirm New Password:</label>
            <span><input id="password" class="block mt-1 w-full" type="password" name="confirm" required /></span>
        </div>

        <div class="button">
            <button type="submit" class="btn btn-danger text-uppercase mr-2 px-4">reset</button>
        </div>
    </form>
</div>

问题排查

  1. 验证规则与表单字段不匹配:控制器中newpassword字段使用了confirmed验证规则,该规则要求确认密码字段的name必须为newpassword_confirmation,但表单里确认密码的name是confirm,导致验证失败,后续更新代码根本未执行。
  2. 多余的终止代码:更新密码后执行的dd($request->password);会直接终止程序,且$request->password不存在(表单无对应字段),导致成功跳转逻辑无法触发,也无法看到更新成功提示。
  3. 表单input的id重复:所有密码输入框的id都设为password,虽不影响功能,但不符合HTML规范,易引发混淆。

修复步骤

1. 修正表单确认密码字段

将确认密码的name改为newpassword_confirmation,同时修正对应id:

<div>
    <label class="font-italic mb-1" style="padding: 1rem">Confirm New Password:</label>
    <span><input id="newpassword_confirmation" class="block mt-1 w-full" type="password" name="newpassword_confirmation" required /></span>
</div>

2. 优化控制器代码

移除多余的dd代码,同时简化用户更新逻辑(直接使用auth()->user()无需重复查询):

public function update_password(Request $request)
{
    $request->validate([
        'oldpassword' => ['required','string','min:8'],
        'newpassword' => ['required', 'string', 'min:8', 'confirmed']
    ]);

    $currentPasswordStatus = Hash::check($request->oldpassword, auth()->user()->password);
    if($currentPasswordStatus){
        auth()->user()->update([
            'password' => Hash::make($request->newpassword)
        ]);

        return redirect()->route('profile')->with('message','Password Updated Successfully');
    }else{
        return redirect()->back()->with('message','Current Password does not match with Old Password');
    }
}

3. 可选:添加表单错误提示

在表单中加入验证错误显示,方便快速排查问题:

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

内容的提问来源于stack exchange,提问作者Divine SCONTY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:05:20