Laravel 8中如何在API路由的控制器中使用Auth门面获取用户信息
解决Laravel 8 API路由中使用Breeze登录后无法获取Auth::user()的问题
我懂你的需求——不想花时间折腾Sanctum的自定义登录逻辑,只想继续用Breeze现成的登录页,同时让API路由里的控制器能正常拿到登录用户。其实不用把路由移去web.php,只需要调整下API路由的中间件配置就行,给你两个简便的方案:
方案一:给单个API路由添加Web中间件
API路由默认用的是无状态的api中间件组,而Breeze的登录是基于Session的(属于web中间件组的处理逻辑)。你只需要给需要获取用户信息的API路由加上web中间件,就能让它支持Session认证:
// routes/api.php use App\Http\Controllers\CompanyController; use Illuminate\Support\Facades\Route; Route::get('team', [CompanyController::class, 'index'])->middleware('web');
配置完成后,这个API路由就会加载Web中间件组里的Session、Cookie相关处理逻辑,Auth::user()就能正常拿到当前登录的用户了。
方案二:全局调整API中间件组(适合多个API路由需要Session的场景)
如果你的大部分API路由都需要获取登录用户,可以直接修改app/Http/Kernel.php里的api中间件组,把Session相关的中间件加进去:
// app/Http/Kernel.php protected $middlewareGroups = [ 'web' => [ // ... 保留原有web中间件内容 ], 'api' => [ \Illuminate\Cookie\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
添加后,所有API路由都会默认支持Session认证,你就不用逐个路由加中间件了。
为什么原来的配置不行?
Laravel的api路由默认使用auth:api守卫,这个守卫是基于Token的无状态认证;而Breeze搭建的登录系统用的是web守卫,基于Session。所以直接在API路由里调用Auth::user()时,默认用的是api守卫,自然拿不到Session里的登录用户。
这两个方案都不用改动Breeze的登录页,完全沿用你现有的登录流程,非常省心。
内容的提问来源于stack exchange,提问作者Andre W.
相关产品推荐
相关产品推荐

