Laravel 9中Auth::getRecallerName()生成异常记住令牌名称问题
问题根源是自定义RememberMeTrait中硬编码使用了web守卫名称生成Cookie,没有动态适配当前登录所用的守卫(admin/user)。以下是具体修复步骤:
1. 定位Trait中Cookie名称的硬编码部分
打开你的RememberMeTrait,找到设置「记住我」Cookie的代码段,原代码大概率固定写死了remember_web_前缀:
// 错误示例:硬编码web守卫 protected function setRememberTokenCookie($user) { $rememberToken = $user->getRememberToken(); if (!empty($rememberToken)) { $this->cookie->queue( 'remember_web_' . $user->getKey(), // 此处web为硬编码 $rememberToken, $this->getRememberMeExpiration() ); } }
2. 动态获取当前守卫名称修改Cookie前缀
修改Trait中的方法,通过$this->guard()->getName()动态获取当前登录使用的守卫名称,替换硬编码的web:
use Illuminate\Support\Facades\Cookie; trait RememberMeTrait { protected function setRememberTokenCookie($user) { $rememberToken = $user->getRememberToken(); // 动态获取当前守卫名称(admin或user) $guardName = $this->guard()->getName(); if (!empty($rememberToken)) { Cookie::queue( 'remember_' . $guardName . '_' . $user->getKey(), // 动态生成Cookie前缀 $rememberToken, $this->getRememberMeExpiration(), null, null, false, true // 保留HttpOnly安全属性 ); } } // 自定义过期时间方法(你的原有代码) protected function getRememberMeExpiration() { return 60 * 24 * 30; // 示例:30天有效期 } }
3. 确保LoginController正确绑定守卫
在对应的登录控制器(比如AdminLoginController)中,明确指定当前使用的守卫,避免默认使用web守卫:
use Illuminate\Support\Facades\Auth; class AdminLoginController extends Controller { use AuthenticatesUsers, RememberMeTrait; // 指定当前守卫为admin protected function guard() { return Auth::guard('admin'); } // 其他登录相关代码... }
4. 验证修复效果
使用admin守卫登录并勾选「记住我」,检查浏览器Cookie列表,应该能看到名称为remember_admin_xxx的Cookie,而非之前的remember_web_xxx。
内容的提问来源于stack exchange,提问作者Saswat
相关产品推荐
相关产品推荐

