流水线操作的安全规则
借助 流水线操作规则,您可以匹配现有规则引擎的过滤功能。虽然流水线操作提供了一系列丰富的功能,但规则引擎仅限于识别简单过滤条件,以确保查询的可满足性和安全性。
版本和模式要求
本文档适用于原生模式下的 Firestore 企业版。
支持的过滤表达式
如需通过规则限制查询,查询必须使用标准比较运算符与常量进行比较。规则引擎可识别以下过滤条件类型:
- 等式和不等式:
eq、neq。 - 比较对象:
gt、gte、lt、lte。 - 会员资格:
in、arrayContains。
下面是一些示例:
where(eq("foo", 2))where(lt("foo", 2))documents("/user/1", "/user/2").where(...)
请求属性
您可以继续使用 request 对象来验证身份验证和查询上下文,不过流水线不支持标准查询中的某些属性。
支持的属性
新版引擎继续支持以下属性:
request.auth:访问用户 UID 和令牌数据。request.method:用于标识操作(例如get、list)。request.path:所访问资源的路径。request.time:请求的服务器端时间戳。
不支持的属性
由于在多阶段查询中确定这些值的复杂性,流水线规则检查不支持 request.query 属性(例如 limit、offset 和 orderBy)。
流水线阶段处理和权限
不同的流水线阶段会映射到安全规则中的特定细粒度操作:
allow list权限:由collection()、collectionGroup()和database()阶段触发。allow get权限:由documents()阶段触发,该阶段的处理方式与批量get操作类似。- 字段修改阶段:规则仅对存储的数据进行操作,而不对派生值进行操作。如果流水线包含修改字段的阶段(例如
AddFields、ReplaceWith、Select),规则引擎会在遇到该阶段后停止应用过滤条件限制。 - 字面值阶段:
literals()阶段不从数据库读取数据,但可能会产生费用。为防止滥用,它必须与另一个可通过规则验证的阶段(例如collection())配对。