firebase - Firebase Firestore 安全规则:在创建规则中触摸 resource.data 始终返回 false
问题描述
我试图了解resource.data
Firestore 的安全规则,因为它在规则中有一些特殊性create
。以下返回错误:
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
被触及,我都会得到意想不到的结果。我正在尝试了解如何检测规则create
内的操作write
并应用适当的逻辑。有什么办法可以做到这一点?
解决方案
事实证明,if ('foo' in resource.data) || !('foo' in resource.data);
不评估为真的原因是因为resource.data
在创建时默默地抛出异常,它迫使整个事情评估为假。检查规则是否由规则触发create
或update
在规则中触发的write
方法很简单:
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
推荐阅读
- c++ - 什么是自定义点对象以及如何使用它们?
- android - 有关通过 android 设备在应用程序上显示单击图像的问题
- java - 如何转换 PCollection
java 内存集合中只有一个元素? - php - 在环境托管工作时出现代码错误
- c# - 具有重复项的 LINQ 联合
- sql-server - 使用 GROUP BY 为相应的最大日期选择 ID
- heroku - 部署到 Heroku 后,环回 ACL 不起作用
- proxy - 无法在集群上安装 Ambari 服务
- scheme - 如何在andmap内部的lambda函数中返回一个值
- mysql - 如何创建两个不同 django 模型的联合?