【发布时间】:2021-03-24 23:13:55
【问题描述】:
我正在尝试了解 Firestore 安全规则中的 resource.data,因为 create 规则中有一些特殊之处。以下返回false:
allow create: if ('foo' in resource.data) || !('foo' in resource.data);
我相信这是因为 resource.data 在创建操作中不存在,因为以下 2 个语句解析为 true:
allow create: if ('foo' in request.resource.data) || !('foo' in request.resource.data);
allow update: if ('foo' in resource.data) || !('foo' in resource.data);
即使这样也失败了:
allow create: if debug(resource.data.size()) == 0;
现在您可能想知道为什么我需要在创建规则中触摸resource.data。这是因为我正在使用双重职责write 规则而不是create 规则,并且任何时候resource.data 被触及,我都会得到意想不到的结果。我正在尝试查看如何在write 规则中检测create 操作并应用适当的逻辑。有什么办法吗?
【问题讨论】:
-
您能否举例说明您正在尝试实施的写入规则以及您希望它允许/拒绝什么?
-
resource.data子句在create中确实是空的,但request.resource.data应该包含您正在写入的数据(或更准确地说:因为它会在写入成功后存在)。检测写入规则中的创建应该类似于:!exists(resource)。 -
@FrankvanPuffelen 谢谢你,你带领我朝着正确的方向前进。
!exists(resource)不起作用,因为resource是一张地图,而exists需要一条路径。但是,resource == null确实有效。我正在尝试resource.data == null并且抛出异常。
标签: firebase google-cloud-firestore firebase-security