【问题标题】:Firebase Firestore Security Rule: touching resource.data in create rule always returns falseFirebase Firestore 安全规则:在创建规则中触摸 resource.data 始终返回 false
【发布时间】: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


【解决方案1】:

事实证明,if ('foo' in resource.data) || !('foo' in resource.data); 不计算为 true 的原因是因为 resource.data 在创建时默默地抛出了一个异常,它迫使整个事情计算为 false。在write 规则中检查规则是否由createupdate 触发的方法很简单:

resource == null // if true, it's create, otherwise, it's update

2022-01-22 更新:

还有一种更语义化的方式来确定操作是否是创建:

request.method == 'create'

文档:https://firebase.google.com/docs/rules/rules-language#building_conditions

【讨论】:

  • 很高兴听到您成功了,感谢您分享您的解决方案?
猜你喜欢
  • 2020-09-07
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
相关资源
最近更新 更多