Laravel中如何让Auth类使用Admin模型而非User模型执行认证方法
问题原因
你遇到的报错是因为Laravel默认的认证守卫使用的用户提供者关联的是App\Models\User模型,你的User模型仅继承了基础Model类,未继承认证所需的Authenticatable基类,缺少认证相关的核心方法;同时你要用于管理员认证的Admin模型没有被配置为认证提供者的关联模型。
解决方案
1. 修改认证配置
打开项目根目录下config/auth.php文件,按如下规则修改:
新增Admin认证提供者
找到providers配置段,新增Admin对应的认证提供者,原有User相关的配置保留不影响业务使用:
'providers' => [ // 原有User模型配置保留,用于非认证业务场景 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], // 新增管理员认证提供者 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], ],
配置认证守卫
找到guards配置段,可根据需求二选一配置:
- 方案A:修改默认web守卫的关联提供者,所有默认Auth调用都走Admin认证
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'admins', // 把原默认值users改为admins ], ],
- 方案B:新增独立的admin守卫,不修改默认配置,避免影响其他业务
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], // 新增管理员专属守卫 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ],
2. 调用认证方法
- 如果采用方案A修改了默认守卫配置,原有
Auth::attempt()、Auth::logout()调用无需修改即可正常使用 - 如果采用方案B新增了独立守卫,调用认证方法时需要指定守卫:
// 登录验证 Auth::guard('admin')->attempt($credentials); // 登出 Auth::guard('admin')->logout();
3. 清理配置缓存
修改配置后执行命令清理缓存,确保配置生效:php artisan config:clear
内容的提问来源于stack exchange,提问作者Osama Amr
相关产品推荐
相关产品推荐

