首页 > 解决方案 > Laravel Lighthouse Graphql 多个守卫

问题描述

我正在尝试使我的自定义防护与 Lighthouse 对抗 GraphQL 模式,但它不起作用。

问题是 graphql 查询没有达到我的自定义保护。

schema.graphql:(为简洁起见删除了一些代码)

extend type Query @guard(with: ["api", "partner"])
{
    GetHighscores(): [Highscore!]!
}

注意@guard指令,它有apipartner。我希望他们按那个顺序运行(顺便说一句,它有顺序吗?)。

现在定义partner守卫 AuthServiceProvider@boot

Config::set('auth.guards.partner', [
    'driver' => 'partner',
]);

Auth::viaRequest('partner', function (Request $request) {
    dd('MUST GET HERE');
});

当我使用经过身份验证的承载令牌运行查询时,partner不执行保护。但是,如果我在此partner之前设置了警卫,api它就会被执行。我在这里想念什么?

编辑

使用 CURL,我请求了一个受保护的 laravel 路由,它可以工作:

Route::middleware(['auth:api', 'auth:partner'])->get('/partners', function (Request $request) {
    print_r($request->user()->toArray());
});

它打印了dd()消息,这是正确的。

那么为什么灯塔无法联系到我的海关警卫呢?

标签: laravelapilaravel-lighthouse

解决方案


lighthouse @guard 指令的行为类似于 OR 指令。如果第一个守卫通过,则永远不会检查第二个守卫。

您可以添加两次 @guard 指令。我认为这应该有效。

extend type Query @guard(with: ["api"]) @guard(with: ["partner"])
{
    GetHighscores(): [Highscore!]!
}

这是指令中的代码:

/**
 * Determine if the user is logged in to any of the given guards.
 *
 * @param  array<string>  $guards
 *
 * @throws \Illuminate\Auth\AuthenticationException
 */
protected function authenticate(array $guards): void
{
    foreach ($guards as $guard) {
        if ($this->auth->guard($guard)->check()) {
            $this->auth->shouldUse($guard);

            return;
        }
    }

    $this->unauthenticated($guards);
}

推荐阅读