yireo / magento2-custom-graph-ql-query-limiter
Magento 2模块,用于同步GraphQL会话与常规会话
Requires
- php: ^8.0
- magento/framework: ^100.1|^101.0|^102.0|^103.0
- magento/module-checkout: ^100.1
- magento/module-quote: ^100.1|^101.0
Requires (Dev)
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库还允许您向特定字段定义添加复杂性函数。从理论上讲,这可能需要对每个查询(categories
、products
)进行定制。什么使特定的查询性能较低,因此需要被标记为复杂?
请注意,在数据库中设置查询深度或复杂性的空值将导致值被跳过。此时,将考虑原始DI配置。