Laravel中如何判断当前请求所使用的认证Guard?
如何检查当前请求对应的Guard
在你的场景里,同一浏览器同时登录了web和admin Guard,且两者的check()都返回true,要确定当前请求对应的Guard,最直接靠谱的方法是利用Laravel Auth中间件的内置行为:
当你通过auth或auth:admin中间件完成认证后,Laravel会自动调用shouldUse()方法,把当前请求上下文的默认Guard设置为该中间件指定的Guard。这时你只需要一行代码就能拿到当前请求对应的Guard:
$currentGuard = Auth::getDefaultDriver();
为什么这个方法有效?
Laravel自带的Authenticate中间件(就是我们常用的auth中间件)在认证成功时,会执行$this->auth->shouldUse($guard)——这个操作会把当前请求的默认Guard切换为中间件指定的那个(比如admin),而不是全局配置的默认Guard。所以哪怕你全局默认Guard是web,只要当前请求是通过auth:admin中间件认证的,Auth::getDefaultDriver()就会返回admin。
实际验证示例
假设你的路由是这么配置的:
// 前台用户路由,用默认auth中间件(对应web Guard) Route::middleware('auth')->group(function () { Route::get('/user/dashboard', function () { dd(Auth::getDefaultDriver()); // 输出 'web' }); }); // 管理员后台路由,用auth:admin中间件 Route::middleware('auth:admin')->prefix('admin')->group(function () { Route::get('/dashboard', function () { dd(Auth::getDefaultDriver()); // 输出 'admin' }); });
当你同时登录用户和管理员后,访问前台仪表盘会返回web,访问后台仪表盘会返回admin,完全匹配当前请求对应的Guard。
补充:未经过认证的请求怎么办?
如果请求没走auth中间件(比如公共页面),Auth::getDefaultDriver()会返回auth.php配置文件里defaults.guard的值(一般是web)。要是需要区分这种未认证的情况,可以结合Auth::check()判断:
if (Auth::check()) { $currentGuard = Auth::getDefaultDriver(); } else { // 当前请求未经过认证,没有对应的Guard }
内容的提问来源于stack exchange,提问作者Naveed
相关产品推荐
相关产品推荐

