流水线操作的安全规则

借助 流水线操作规则,您可以匹配现有规则引擎的过滤功能。虽然流水线操作提供了一系列丰富的功能,但规则引擎仅限于识别简单过滤条件,以确保查询的可满足性和安全性。

版本和模式要求

本文档适用于原生模式下的 Firestore 企业版。

支持的过滤表达式

如需通过规则限制查询,查询必须使用标准比较运算符与常量进行比较。规则引擎可识别以下过滤条件类型:

  • 等式和不等式:eqneq
  • 比较对象:gtgteltlte
  • 会员资格:inarrayContains

下面是一些示例:

  • where(eq("foo", 2))
  • where(lt("foo", 2))
  • documents("/user/1", "/user/2").where(...)

请求属性

您可以继续使用 request 对象来验证身份验证和查询上下文,不过流水线不支持标准查询中的某些属性。

支持的属性

新版引擎继续支持以下属性:

  • request.auth:访问用户 UID 和令牌数据。
  • request.method:用于标识操作(例如 getlist)。
  • request.path:所访问资源的路径。
  • request.time:请求的服务器端时间戳。

不支持的属性

由于在多阶段查询中确定这些值的复杂性,流水线规则检查不支持 request.query 属性(例如 limitoffsetorderBy)。

流水线阶段处理和权限

不同的流水线阶段会映射到安全规则中的特定细粒度操作:

  • allow list 权限:由 collection()collectionGroup()database() 阶段触发。
  • allow get 权限:由 documents() 阶段触发,该阶段的处理方式与批量 get 操作类似。
  • 字段修改阶段:规则仅对存储的数据进行操作,而不对派生值进行操作。如果流水线包含修改字段的阶段(例如 AddFieldsReplaceWithSelect),规则引擎会在遇到该阶段后停止应用过滤条件限制。
  • 字面值阶段:literals() 阶段不从数据库读取数据,但可能会产生费用。为防止滥用,它必须与另一个可通过规则验证的阶段(例如 collection())配对。