yireo/magento2-custom-graph-ql-query-limiter

Magento 2模块,用于同步GraphQL会话与常规会话

0.0.4 2024-04-12 09:22 UTC

This package is auto-updated.

Last update: 2024-09-12 14:58:26 UTC


README

Magento 2模块,用于自定义GraphQL查询限制器的设置,以增强无头Magento的性能和安全性。

安装

通过composer安装(composer require yireo/magento2-custom-graph-ql-query-limiter),启用模块Yireo_CustomGraphQlQueryLimiter,刷新缓存,并通过DI编译、静态内容和数据库升级进行操作。

用法

Yireo CustomGraphQlQueryLimiter模块允许您通过简单地更改这些值从Magento管理面板来轻松地修改查询深度和查询复杂性。只需导航到后端的商店配置,然后到Yireo > Yireo CustomGraphQlQueryLimiter > 设置并设置所需的值。

此外,它还在开发者模式中启用了这些设置,而默认情况下,Magento只在生产模式下启用此功能。这使得测试事情变得更简单,而不是在遇到潜在问题之前。

一旦您更新了设置,请确保使用包括更复杂的GraphQL查询、突变和片段(例如,在Magento PWA Studio中)在内的完整客户端应用程序进行测试,因为这可能会破坏您的应用程序。

介绍

Magento 2.3+附带GraphQL API,允许您执行这些简单的查询

{
  products(filter: {name: {match: "jacket"}}) {
    items { sku }
  }
}

基于相同类型的查询,您还可以创建产品类别的递归查找,可能看起来像这样

{
  products(filter: {name: {match: "jacket"}}) {
    items {
      sku
      categories {
        products {
          items {
            sku
            categories {
              products {
                items {
                  sku
                  categories {
                    products {
                      items {
                        sku
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

在我的开发环境中,这很快会导致超时,这证明了这种类型的查询可能不会对生产环境产生好处,至少可以说。

Magento 2的GraphQL系统基于Webonyx GraphQL PHP库,该库提供了一些安全机制来防止此类查询被处理:查询深度和查询复杂性。Magento 2核心使用DI类型设置这些值,您可以使用自己的DI类型来覆盖这些值

<type name="Magento\Framework\GraphQl\Query\QueryComplexityLimiter">
    <arguments>
        <argument name="queryDepth" xsi:type="number">20</argument>
        <argument name="queryComplexity" xsi:type="number">300</argument>
    </arguments>
</type>

查看上述有问题的查询,深度为10:只需从返回语句(items)的开始处计算开括号{的数量。将queryDepth设置为7或8,查询将生成错误

{
  "errors": [
    {
      "message": "Max query depth should be 7 but got 10.",
      "extensions": {
        "category": "graphql"
      }
    }
  ]
}

设置复杂性

复杂性也可以修改。查看上述有问题的查询,复杂性为15。这证明了GraphQL查询的复杂性可能相当低,但影响仍然可能很高。然而,将复杂性设置为300似乎相当高。也许在您的案例中,将其设置为50可能更好。

Webonyx库还允许您向特定字段定义添加复杂性函数。从理论上讲,这可能需要对每个查询(categoriesproducts)进行定制。什么使特定的查询性能较低,因此需要被标记为复杂

请注意,在数据库中设置查询深度或复杂性的空值将导致值被跳过。此时,将考虑原始DI配置。