流水线操作的安全规则

流水线查询规则支持的主要目标是与现有规则引擎的过滤功能匹配。虽然流水线查询提供了一组丰富的功能,但规则引擎仅限于识别简单过滤条件,以确保查询的可满足性和安全性。

支持的过滤表达式

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

  • 等式和不等式:eqneq
  • 比较:gtgteltlte
  • 成员:inarrayContains

下面是一些示例:

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

请求属性

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

支持的属性

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

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

不支持的属性

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

流水线阶段处理和权限

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

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