You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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表,和你的业务需求不符。

解决步骤
    1. 控制器调用Auth时指定admin guard
      将AdminProfileSettings控制器的index方法修改为以下内容即可解决,无需重复查询数据库:
public function index()
{
    $adminData = Auth::guard('admin')->user();
    return view('admin.admin_profile_settings',compact('adminData'));
}

如果需要单独拿ID,可以写为$id = Auth::guard('admin')->id();。

    1. 确认认证配置正确
      检查config/auth.php中的guard与provider配置,确保admin guard指向正确的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,
    ],
],
    1. 确认登录逻辑使用了正确的guard
      检查管理员登录的代码,必须指定admin 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:06:07