Laravel Lighthouse中query depth与complexity校验配置求助
Laravel Lighthouse 生产环境配置Query Depth与Complexity校验问题
问题背景
部署Laravel Lighthouse到生产环境前,需要配置query depth和query complexity校验以保障接口安全。已知config/lighthouse.php中存在相关安全配置项,但尝试多种方式后均未生效,同时自定义@complexity指令的解析方法也未被调用。
已尝试的操作
- 查看默认安全配置段:
/* |-------------------------------------------------------------------------- | 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, ],
- 尝试在生成的查询类
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 [ ... ]; } }
- 使用
@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
相关产品推荐
相关产品推荐

