
在 Laravel 8 中使用多认证守卫(如 admin)时,auth()->admin() 是非法调用;应通过 auth('admin')->user() 显式指定守卫并获取已登录的管理员模型实例。
在 laravel 8 中使用多认证守卫(如 `admin`)时,`auth()->admin()` 是非法调用;应通过 `auth('admin')->user()` 显式指定守卫并获取已登录的管理员模型实例。
当项目中配置了多个认证守卫(例如 web 和 admin),Laravel 的 Auth 门面默认操作的是 defaults.guard(即 web),它不支持链式调用如 auth()->admin() 或 auth()->web() —— 这类写法会触发 Method Illuminate\Auth\SessionGuard::admin does not exist 错误,因为 SessionGuard 类没有名为 admin 的方法。
✅ 正确做法是:显式传入守卫名称到 auth() 辅助函数中,再调用 user() 方法:
// ✅ 正确:指定 'admin' 守卫,获取当前登录的 Admin 模型实例
$admin = auth('admin')->user();
if (!$admin) {
return back()->with('error', '请先登录管理员账号!');
}
if (!Hash::check($request->old_password, $admin->password)) {
return back()->with('error', '原密码不正确!');
}⚠️ 注意事项:
-
auth('admin')->user()返回的是App\Models\Admin实例(基于auth.php中adminsprovider 配置的模型),若用户未登录则返回null,务必先判空,避免调用->password报错; - 不要使用
Auth::id()或auth()->id(),它们默认返回web守卫下的用户 ID;应改用auth('admin')->id()获取管理员 ID; - 更新密码时,推荐使用 Eloquent 的
update()方法确保模型事件和访问器正常触发:
$admin->update([
'password' => Hash::make($request->new_password)
]);
auth('admin')->logout(); // 退出当前管理员会话
return redirect('admin/login')->with('status', '密码修改成功,请重新登录!');? 扩展提示:
你还可以在控制器构造函数中统一设置守卫(适用于全控制器均操作 admin):
public function __construct()
{
$this->guard = 'admin';
$this->middleware(function ($request, $next) {
auth()->shouldUse($this->guard);
return $next($request);
});
}但更推荐显式调用 auth('admin'),语义清晰、不易出错,也便于后期维护与多守卫共存场景的扩展。


















