Laravel 11中Log Viewer中间件Auth::check()返回false求助
解决Laravel 11 + Passport下Log Viewer中间件Auth::check()返回false的问题
问题根源
Laravel Passport默认使用api guard进行令牌认证,而Auth::check()默认调用web guard(基于session的认证)。Log Viewer的路由使用web中间件组,默认不会处理Passport的令牌认证逻辑,导致当前请求无法通过web guard识别已登录用户,因此Auth::check()始终返回false。
解决方案
方案1:修改自定义中间件,指定使用api guard检查认证
直接在中间件中切换到Passport对应的api guard进行认证检查:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class ViewLogs { public function handle(Request $request, Closure $next) { // 使用api guard验证用户身份及权限 if (Auth::guard('api')->check() && Auth::guard('api')->user()->hasRole('admin')) { return $next($request); } abort(401, 'Unauthorised'); } }
注意:访问Log Viewer时,需要在请求头中携带Passport的Bearer令牌(例如在浏览器开发者工具的请求头中添加Authorization: Bearer {你的令牌})。
方案2:给Log Viewer路由添加Passport的auth:api中间件
在Log Viewer的配置中加入Passport的auth:api中间件,让路由自动处理令牌认证,之后只需在自定义中间件中检查角色即可:
- 修改
config/log-viewer.php中的middleware配置:
'middleware' => [ 'web', 'auth:api', // 添加Passport的api认证中间件 'view-logs', \Opcodes\LogViewer\Http\Middleware\AuthorizeLogViewer::class, ],
- 简化自定义中间件(此时
auth:api已确保用户已认证):
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class ViewLogs { public function handle(Request $request, Closure $next) { if ($request->user()->hasRole('admin')) { return $next($request); } abort(403, 'Forbidden'); // 已认证但无权限,返回403更合适 } }
额外检查项
- 确保已发布Log Viewer的配置文件:执行
php artisan vendor:publish --tag=log-viewer-config - 确认Passport的
apiguard在config/auth.php中配置正确:
'guards' => [ 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
内容的提问来源于stack exchange,提问作者Zekura
相关产品推荐
相关产品推荐

