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

