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

Laravel 11.x 已认证用户密码修改API返回200但密码未变更

问题诊断与解决方案

可能的原因及对应修复方案


1. 用户模型密码字段处理逻辑冲突

如果你的User模型中定义了setPasswordAttribute方法,会自动处理密码哈希,此时代码中手动调用bcrypt()会导致双重哈希,最终存储的密码无法匹配。另外,若模型关闭了$timestamps,也会导致save()无法触发更新。

修复步骤:
打开app/Models/User.php,检查并调整密码处理逻辑:

// 若存在该方法,确保逻辑正确
public function setPasswordAttribute($value)
{
    $this->attributes['password'] = bcrypt($value);
}

如果有上述方法,代码中直接赋值明文密码即可,无需手动哈希:

$user->password = $request->new_password;

2. 数据库字段或模型属性限制

  • 检查users表的password字段类型是否为varchar(255):Laravel哈希后的密码长度较长,字段过短会导致密码被截断,保存失败但无报错。
  • 确认User模型未将password列入不可更新属性:
// 确保$guarded不包含password,或$fillable明确包含password
protected $guarded = [];
// 或
protected $fillable = ['name', 'email', 'password'];

3. 强制刷新实例并验证保存状态

Eloquent实例可能存在缓存,或save()因未检测到属性变化返回true但未执行更新。可以强制刷新实例并检查保存结果:

修改后的完整路由代码:

Route::post('/change-password', function (Request $request) {
    $request->validate([
        'current_password' => 'required|string',
        'new_password' => 'required|string|confirmed|min:8',
    ]);

    // 从数据库重新获取用户实例,避免缓存影响
    $user = $request->user()->fresh();

    if (!Hash::check($request->current_password, $user->password)) {
        return response()->json([
            'message' => '当前密码不匹配。',
        ], 422);
    }

    $user->password = bcrypt($request->new_password);
    // 保存并检查结果
    $isSaved = $user->save();

    if (!$isSaved) {
        return response()->json([
            'message' => '密码修改失败,请重试。',
        ], 500);
    }

    return response()->json([
        'message' => '密码修改成功。',
    ], 200);
})->middleware('auth:sanctum')->name('password.change');

4. 排查事务或模型事件干扰

如果项目全局开启了数据库事务,或User模型绑定了saving/saved事件监听器,可能会中断或回滚密码更新操作:

  • 暂时注释模型中的事件监听器,测试是否能正常保存。
  • 检查代码中是否存在未提交的事务逻辑。

验证修改结果

测试API后,直接查询users表对比password字段值,确认是否发生变化;同时使用新密码重新登录,验证认证功能是否正常。

内容的提问来源于stack exchange,提问作者Houssem Eddine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:00:55