Laravel Lighthouse Graphql 多重守卫
Laravel Lighthouse Graphql multiple guards
我正在尝试让我的自定义防护装置与 Lighthouse 一起对抗 GraphQL 架构,但它不起作用。
问题是 graphql 查询无法到达我的自定义守卫。
schema.graphql:(为简洁起见删除了一些代码)
extend type Query @guard(with: ["api", "partner"])
{
GetHighscores(): [Highscore!]!
}
注意 @guard
指令,它有 api
和 partner
。我希望他们按顺序 运行(顺便说一句,它有顺序吗?)。
现在partner
守卫的定义
AuthServiceProvider@boot
Config::set('auth.guards.partner', [
'driver' => 'partner',
]);
Auth::viaRequest('partner', function (Request $request) {
dd('MUST GET HERE');
});
当我 运行 使用经过身份验证的不记名令牌进行查询时,不会执行守卫 partner
。但是,如果我在 api
之前设置 partner
守卫,那么它就会被执行。我在这里错过了什么?
编辑
使用 CURL,我请求了一个受保护的 laravel 路由并且它有效:
Route::middleware(['auth:api', 'auth:partner'])->get('/partners', function (Request $request) {
print_r($request->user()->toArray());
});
它打印了 dd()
消息,这是正确的。
为什么 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);
}
我解决了我的问题,将 API 守卫的支票移到合作伙伴守卫内:
Auth::viaRequest('partner', function (Request $request) {
$user = auth()->user();
if ($user &&
$user->partner()->exists() === true &&
auth()->guard('api')->check() === true
) {
return $user;
}
});
在 graphql 架构中:
extend type Query @guard(with: "partner")
{
GetHighscores(): [Highscore!]!
}
我仍然认为 Lighthouse 应该像“AND”一样照顾多个守卫......无论如何,它现在正在工作。
我正在尝试让我的自定义防护装置与 Lighthouse 一起对抗 GraphQL 架构,但它不起作用。
问题是 graphql 查询无法到达我的自定义守卫。
schema.graphql:(为简洁起见删除了一些代码)
extend type Query @guard(with: ["api", "partner"])
{
GetHighscores(): [Highscore!]!
}
注意 @guard
指令,它有 api
和 partner
。我希望他们按顺序 运行(顺便说一句,它有顺序吗?)。
现在partner
守卫的定义
AuthServiceProvider@boot
Config::set('auth.guards.partner', [
'driver' => 'partner',
]);
Auth::viaRequest('partner', function (Request $request) {
dd('MUST GET HERE');
});
当我 运行 使用经过身份验证的不记名令牌进行查询时,不会执行守卫 partner
。但是,如果我在 api
之前设置 partner
守卫,那么它就会被执行。我在这里错过了什么?
编辑
使用 CURL,我请求了一个受保护的 laravel 路由并且它有效:
Route::middleware(['auth:api', 'auth:partner'])->get('/partners', function (Request $request) {
print_r($request->user()->toArray());
});
它打印了 dd()
消息,这是正确的。
为什么 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);
}
我解决了我的问题,将 API 守卫的支票移到合作伙伴守卫内:
Auth::viaRequest('partner', function (Request $request) {
$user = auth()->user();
if ($user &&
$user->partner()->exists() === true &&
auth()->guard('api')->check() === true
) {
return $user;
}
});
在 graphql 架构中:
extend type Query @guard(with: "partner")
{
GetHighscores(): [Highscore!]!
}
我仍然认为 Lighthouse 应该像“AND”一样照顾多个守卫......无论如何,它现在正在工作。