Laravel 11登录时出现Session store not set on request问题求助
解决Laravel Sanctum认证中会话重生成与受保护路由访问的矛盾问题
核心问题原因
你的矛盾来自两个关键点:
- 登录路由仅使用
api中间件时,Laravel默认不会加载会话相关中间件,导致调用$request->session()->regenerate()触发"Session store not set on request."错误。 - 注释掉会话重生成后,会话未正确初始化或更新,Sanctum无法识别有效的会话认证状态,因此访问
logout路由时提示未认证。
具体修复步骤
1. 调整路由中间件,确保会话支持
修改bootstrap/app.php中的路由配置,给认证相关路由同时添加web和api中间件——web中间件包含StartSession、EncryptCookies等会话必需的组件:
return Application::configure(basePath: dirname(__DIR__)) ->withRouting( using: function () { Route::middleware(['web', 'api']) ->prefix('api') ->group(function () { require base_path('routes/Api/V1/Auth/routes.php'); }); }, web: __DIR__ . '/../routes/web.php', commands: __DIR__ . '/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { $middleware->statefulApi(); }) ->withExceptions(function (Exceptions $exceptions) { // })->create();
2. 简化登录方法,移除冗余代码
Auth::attempt()成功后已经自动完成用户登录,无需重复调用Auth::login(Auth::user()),同时保留会话重生成逻辑:
public function login(object $request) { // 验证用户凭证 if (!Auth::attempt($request->only(['username', 'password']))) { return $this->failedRequest('', 'Invalid email address or password', 400); } // 重新生成会话,防止会话固定攻击 $request->session()->regenerate(); return $this->successfullRequest(Auth::user(), 'User successfully logged in', 200); }
3. 优化会话Cookie配置(可选但建议)
在.env中添加会话域名配置,确保本地不同端口的服务能共享会话Cookie:
SESSION_DOMAIN=.localhost
4. Postman测试注意事项
发送GET /sanctum/csrf-cookie请求后,务必确保后续的login请求自动携带返回的laravel_session和XSRF-TOKENCookie(Postman默认会自动保存,可在请求的Cookies标签页确认)。
验证效果
完成上述修改后:
- 登录时
$request->session()->regenerate()正常执行,无报错。 - 登录成功后访问
logout路由,Sanctum能正确识别会话认证状态,执行退出逻辑。
内容的提问来源于stack exchange,提问作者henrbu
相关产品推荐
相关产品推荐

