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

Laravel Lighthouse中query depth与complexity校验配置求助

Laravel Lighthouse 生产环境配置Query Depth与Complexity校验问题

问题背景

部署Laravel Lighthouse到生产环境前,需要配置query depth和query complexity校验以保障接口安全。已知config/lighthouse.php中存在相关安全配置项,但尝试多种方式后均未生效,同时自定义@complexity指令的解析方法也未被调用。

已尝试的操作

  1. 查看默认安全配置段:
/*
|--------------------------------------------------------------------------
| Security
|--------------------------------------------------------------------------
|
| Control how Lighthouse handles security related query validation.
| Read more at https://webonyx.github.io/graphql-php/security/
|
*/
'security' => [
    'max_query_complexity' => \GraphQL\Validator\Rules\QueryComplexity::DISABLED,
    'max_query_depth' => \GraphQL\Validator\Rules\QueryDepth::DISABLED,
    'disable_introspection' => \GraphQL\Validator\Rules\DisableIntrospection::DISABLED,
],
  1. 尝试在生成的查询类ExampleQuery.php中手动添加校验规则,无效果:
final class ExampleQuery
{
    public function __invoke(_, array $args)
    {
        $rule = new QueryComplexity(2);
        DocumentValidator::addRule($rule);

        $rule2 = new QueryDepth(2);
        DocumentValidator::addRule($rule2);

        return [
            ...
        ];
    }
}
  1. 使用@complexity指令指定自定义解析器,但对应方法未触发:
type Query {
    userPosts(includeFullText: Boolean!): [Post!]! @complexity(resolver: "App\\Security\\ComplexityAnalyzer@userPosts")
}

对应的解析类代码:

class ComplexityAnalyzer {

    public function userPosts(int $childrenComplexity, array $args): int  // 未被调用
    {
        $postComplexity = $args['includeFullText']
            ? 3
            : 2;
        \Log::Debug($postComplexity); // 无日志输出
        return $childrenComplexity * $postComplexity;

    }
}

解决方案

1. 正确启用全局Query Depth与Complexity校验

无需手动调用DocumentValidator添加规则,直接修改config/lighthouse.php的security配置,将禁用状态改为具体数值即可:

'security' => [
    'max_query_complexity' => 100, // 根据业务场景调整合适阈值
    'max_query_depth' => 8, // 根据业务场景调整合适阈值
    'disable_introspection' => \GraphQL\Validator\Rules\DisableIntrospection::DISABLED,
],

Lighthouse会自动基于配置初始化校验规则,无需手动执行GraphQL::executeQuery。

2. 修复@complexity指令不生效问题

需满足以下几点要求:

  • Schema指令格式正确:在GraphQL Schema中使用指令时,可通过单引号避免转义问题,示例:
@complexity(resolver: 'App\\Security\\ComplexityAnalyzer@userPosts')
  • 解析器方法签名正确:Lighthouse要求复杂度解析器必须包含第三个参数FieldValue,修正后的方法:
use Nuwave\Lighthouse\Schema\Values\FieldValue;

class ComplexityAnalyzer {

    public function userPosts(int $childrenComplexity, array $args, FieldValue $fieldValue): int
    {
        $postComplexity = $args['includeFullText']
            ? 3
            : 2;
        \Log::debug($postComplexity);
        return $childrenComplexity * $postComplexity;
    }
}
  • 清除缓存:执行命令清除Lighthouse的Schema缓存,确保配置生效:
php artisan lighthouse:clear-cache

额外注意事项

  • 不要在查询解析器中添加校验规则:Lighthouse的校验流程在查询执行前已完成,此时添加规则不会生效。
  • 验证生效情况:构造超过阈值的复杂查询,若返回对应错误提示,则说明校验规则已生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:40:29