Laravel 5.8登录后Auth::user()返回null问题求助
我之前处理过类似的会话丢失问题,结合你升级版本和引入Vue的背景,给你梳理几个针对性的排查方向:
1. 检查Web中间件组的重复应用
Laravel从5.4升级到5.8后,routes/web.php里的所有路由默认已经由RouteServiceProvider自动包裹在web中间件组中了(你可以去app/Providers/RouteServiceProvider.php里查看mapWebRoutes方法的实现)。你手动把路由再套一层['middleware' => ['web']]会导致中间件重复执行,很可能引发会话初始化异常。
建议修改你的web.php代码,去掉手动的web中间件组:
Auth::routes(); Route::get('/home', 'HomeController@index')->name('home'); Route::get('/browse', 'ListingController@index')->name('listings');
同时确认app/Http/Kernel.php里的web中间件组包含以下关键会话/认证中间件(顺序不能错):
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // Laravel 5.6+新增的会话认证中间件,必须存在 \Illuminate\Auth\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], // ...其他中间件组 ];
2. 排查会话驱动与Cookie配置
会话存储权限/表结构
- 如果用
file会话驱动,确保storage/framework/sessions目录的权限正确(给服务器运行用户如www-data读写权限,执行chmod -R 755 storage/framework/sessions)。 - 如果用
database驱动,重新生成会话表迁移并执行:php artisan session:table php artisan migrate
Cookie相关配置
检查.env和config/session.php里的关键配置:
SESSION_DOMAIN:要和你的站点域名一致(比如本地开发用localhost,线上用你的真实域名),配置错误会导致浏览器拒绝携带会话Cookie。SESSION_SAME_SITE:Laravel 5.8新增了这个配置,默认可能是strict,如果你的跳转场景有跨域/子域名情况,改成lax或者暂时注释掉测试。SESSION_SECURE:本地开发不要设为true,否则只有HTTPS请求才会携带Cookie,导致会话丢失。
3. 彻底清除缓存残留
虽然你已经执行过清除命令,但再完整走一遍确保没有残留:
php artisan route:clear php artisan config:clear php artisan cache:clear php artisan view:clear composer dump-autoload
注意:开发环境不要用php artisan route:cache和php artisan config:cache,这两个命令会把配置和路由缓存成静态文件,可能导致修改的配置不生效。
4. 浏览器Cookie排查
打开浏览器开发者工具(F12),切换到Application标签,查看Cookies下的站点Cookie:
- 登录后是否存在
laravel_session(或者你自定义的会话Cookie名称)? - 跳转至
/browse后,这个Cookie是否还存在? - 检查Cookie的
Domain、Path、Expires/Max-Age是否符合预期。
5. Vue相关的潜在冲突
如果你的Vue应用用了前端路由(比如Vue Router),要确保后端路由和前端路由没有冲突。另外,如果Vue项目中用了axios发送请求,检查是否开启了withCredentials:
axios.defaults.withCredentials = true;
不过你这里是服务器端Auth::user()返回null,这个影响不大,但可以作为额外排查点。
内容的提问来源于stack exchange,提问作者caro

