Laravel配置自定义admin guard后获取登录管理员ID报错如何解决
问题根因
Auth::user()默认调用Laravel配置文件中设定的默认guard(通常是对应users表的web guard),你是通过自定义的admin guard登录后台,未指定guard的情况下Auth::user()会返回null,访问id属性就会抛出Trying to get property 'id' of non-object错误。
使用默认guard登录时不报错,是因为此时Auth::user()返回的是users表的用户实例,所以能拿到ID,但数据不属于admins表,和你的业务需求不符。
解决步骤
- 控制器调用Auth时指定
adminguard
将AdminProfileSettings控制器的index方法修改为以下内容即可解决,无需重复查询数据库:
- 控制器调用Auth时指定
public function index() { $adminData = Auth::guard('admin')->user(); return view('admin.admin_profile_settings',compact('adminData')); }
如果需要单独拿ID,可以写为$id = Auth::guard('admin')->id();。
- 确认认证配置正确
检查config/auth.php中的guard与provider配置,确保adminguard指向正确的Admin模型,参考配置如下:
- 确认认证配置正确
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], ],
- 确认登录逻辑使用了正确的guard
检查管理员登录的代码,必须指定adminguard做认证,示例如下:
- 确认登录逻辑使用了正确的guard
if (Auth::guard('admin')->attempt($credentials)) { // 登录成功逻辑 }
优化建议
你自定义的Admin中间件可以替换为Laravel自带的auth中间件并指定guard参数,省去手动维护中间件的成本,路由配置修改为:
Route::middleware('auth:admin')->group(function () { Route::get('/dashbord',[AdminController::class, 'Dashbord'])->name('admin.dashbord'); Route::get('/profile/edit',[AdminProfileSettings::class, 'index'])->name('admin.profile.settings'); });
如果希望整个Admin相关控制器无需每次指定guard,可以在控制器构造方法中设置默认guard:
public function __construct() { Auth::shouldUse('admin'); }
之后控制器内直接调用Auth::user()就会默认返回admin guard的登录用户实例。
内容的提问来源于stack exchange,提问作者Nirosh
相关产品推荐
相关产品推荐

