Laravel多认证系统admin路由调用Auth::user()->id报null属性读取错误
问题原因
错误
Attempt to read property "id" on null本质是Auth::user()返回了null,说明当前请求没有通过预期的认证 guard 拿到登录用户信息。
你在默认example.com/login路由下测试正常,是因为默认路由用的是Laravel自带的webguard,而你新增的admin路由组没有绑定自定义的admin guard,Auth门面默认读取webguard的登录态,你未登录普通用户的情况下自然返回空。
修复方案
- 确认admin guard配置
先检查config/auth.php里的guards配置,确认你新增的admin guard名称,常规配置参考:'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ // 此处为你的admin guard名称 'driver' => 'session', 'provider' => 'admins', ], ], - 给admin路由组绑定guard中间件
所有admin相关路由统一加上auth:admin中间件,指定用admin guard做认证,示例:Route::prefix('admin')->middleware('auth:admin')->group(function () { // 所有admin后台路由都放该分组内 Route::get('/test', function () { dd(Auth::guard('admin')->user()->id); }); }); - 调用Auth时明确指定guard
若不需要给整个路由组加中间件,单独调用时要指定对应guard,不能直接用Auth::user(),写法调整为:dd(Auth::guard('admin')->user()->id); - 校验admin登录逻辑的guard配置
实现admin登录功能时,也要指定对应guard做登录校验,示例逻辑:if (Auth::guard('admin')->attempt($credentials)) { // 登录成功后的跳转逻辑 }
排查验证方法
你可以在admin路由下输出所有guard的登录态快速定位问题:
dd([ 'web_guard用户' => Auth::guard('web')->user(), 'admin_guard用户' => Auth::guard('admin')->user(), ]);
可以直接看到哪个guard下存在有效的登录用户信息。
内容的提问来源于stack exchange,提问作者Mahdi
相关产品推荐
相关产品推荐

