翻译进度
3
分块数量
3
参与人数

安全

这是一篇社区协同翻译的文章,你可以点击右边区块信息里的『改进』按钮向译者提交改进建议。

查询的复杂性分析

这是一个在 Sangria 实现中的 查询复杂性分析 的 PHP 接口

复杂性分析是一种在执行之前计算查询复杂性分数的独立验证规则。
在查询中的每一个字段都有一个默认的分数为 1 (包括 ObjectType 节点 )。总的查询的复杂度是由每个字段的分数组成。 例如, 内省查询的复杂度是 109

如果这个分数查过了临界值,那么该查询并不会执行而是会返回一个错误。

在默认情况下,复杂性分析是被禁用的,如果要启用,则要添加如下规则:

<?php
use GraphQL\GraphQL;
use GraphQL\Validator\Rules\QueryComplexity;
use GraphQL\Validator\DocumentValidator;

$rule = new QueryComplexity($maxQueryComplexity = 100);
DocumentValidator::addRule($rule);

GraphQL::executeQuery(/*...*/);

这将在全局设置规则。 或者,你也可以为 每次执行 提供验证规则。

要自定义字段的分数,添加 复杂性 函数到你的自定义中:

<?php
use GraphQL\Type\Definition\Type;
use GraphQL\Type\Definition\ObjectType;

$type = new ObjectType([
    'name' => 'MyType',
    'fields' => [
        'someList' => [
            'type' => Type::listOf(Type::string()),
            'args' => [
                'limit' => [
                    'type' => Type::int(),
                    'defaultValue' => 10
                ]
            ],
            'complexity' => function($childrenComplexity, $args) {
                return $childrenComplexity * $args['limit'];
            }
        ]
    ]
]);
purple_ling 翻译于 4个月前

限制查询深度

这是 Sangria 执行中 限制查询深度 的 PHP 端口。
例如,内部查询的最大深度为 7.

该配置默认是禁用的。你可以添加下面的验证规则来启用它:

<?php
use GraphQL\GraphQL;
use GraphQL\Validator\Rules\QueryDepth;
use GraphQL\Validator\DocumentValidator;

$rule = new QueryDepth($maxDepth = 10);
DocumentValidator::addRule($rule);

GraphQL::executeQuery(/*...*/);

这将是全局的规则。或者,你可以 每个查询过程 都提供一个验证规则。

Honvid 翻译于 4个月前

禁用自省

自省 是一种获取模式结构的机制。
它被用做像 GraphiQL 的自动补全,查询验证等的工具。

内省是默认开启的。那就意味着任何一个人可以通过发送一个包含 __type__schema 的元字段的特殊查询就可以获取到你的模式的完整描述。

如果你不打算对大众公开你的 API ,那么禁用这个属性是非常有必要的。

GraphQL PHP 为你提供单独的验证规则,该规则禁止查询包含有
__type 或者 __schema 字段。如果要禁用自省,请添加如下的规则:

<?php
use GraphQL\GraphQL;
use GraphQL\Validator\Rules\DisableIntrospection;
use GraphQL\Validator\DocumentValidator;

DocumentValidator::addRule(new DisableIntrospection());

GraphQL::executeQuery(/*...*/);

这将会在全局制定规则。或者,你也可以为 每次执行 提供验证规则。

purple_ling 翻译于 4个月前

本文章首发在 Laravel China 社区
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

参与译者:3
讨论数量: 1
发起讨论


eii_
?用 GraphQL 有办法做 RBAC 权限控制吗
1 个点赞 | 0 个回复 | 问答