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

Laravel 8使用Livewire修改密码后会话过期如何保持登录状态?

问题根源

你遇到的会话过期问题是Laravel默认安全机制导致的:Laravel会话中会存储当前登录用户的密码哈希值用于身份校验,修改用户密码后,数据库的新密码哈希与会话中存储的旧哈希不匹配,Laravel就会自动注销当前会话,触发登录重定向。

解决方法

只需要在密码更新完成后,调用登录方法刷新当前会话的用户身份信息即可,同时你要留在当前页的话不需要主动做跳转,Livewire本身就是单页交互的,修改后的核心代码如下:

public function changePassword()
{
    $this->validate([
        'oldPassword' => 'required',
        'newPassword' => ['required', Password::min(8)
        ->letters()
        ->mixedCase()
        ->numbers()
        ->symbols()
        // ->uncompromised()
        ],
        'confirmPassword' => 'required|min:8|same:newPassword'
    ]);

    // 可以简化获取用户的写法,不需要重复查询数据库
    $user = auth()->user();
    if (Hash::check($this->oldPassword, $user->password)) {
        $user->update([
            'password' => Hash::make($this->newPassword),
            'updated_at' => Carbon::now()->toDateTimeString()
        ]);
        // 新增这行,刷新会话中的用户身份信息,保持登录状态
        auth()->login($user);
        // 重置表单字段,清空输入框内容
        $this->reset(['oldPassword', 'newPassword', 'confirmPassword']);
        $this->emit('showAlert', [
            'msg' => 'Your password has been successfully changed.'
        ]);
        // 删掉原有redirect,不需要跳转,直接留在当前页即可
        // return redirect()->route('user.changepassword');
    } else {
        $this->emit('showAlertError', [
            'msg' => 'Old password does not match.'
        ]);
    }
}

额外优化建议

  • Livewire的wire:submit.prevent提交已经自带CSRF校验,Blade模板里的@csrf属于多余代码,可以删除
  • Blade底部的livewire:load事件监听没有实际作用,可以直接删除,你写的e.preventDefault()不会对提交逻辑产生任何帮助,还可能引发未知问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:27:03