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

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中间件,让路由自动处理令牌认证,之后只需在自定义中间件中检查角色即可:

  1. 修改config/log-viewer.php中的middleware配置:
'middleware' => [
    'web',
    'auth:api', // 添加Passport的api认证中间件
    'view-logs',
    \Opcodes\LogViewer\Http\Middleware\AuthorizeLogViewer::class,
],
  1. 简化自定义中间件(此时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的api guard在config/auth.php中配置正确:
'guards' => [
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

内容的提问来源于stack exchange,提问作者Zekura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:12:48