android - “允许创建”不适用于 Firestore 规则中的某些集合
问题描述
我在 Firestore 中有一个数据库,其中包含我定义了具有读取、创建、更新和删除操作的安全规则的集合数量。
直到星期六中午,所有具有给定条件的规则都允许读取数据并将数据写入集合,但突然之后,在一个名为“位置”的特定集合中,它给出了PERMISSION DENIED例外,仅用于在同一集合中创建文档但读取、更新并删除作品。
所以我更改了该集合的规则,如下所示进行测试
match /locations/{locationID} {
allow read: if true;
allow create: if true; //Condition commented...
allow update: if <condition>;
allow delete: if false;
}
在Android客户端中我编码为
database.collection("locations").add(mapData)
.addOnCompleteListener {
if (it.isSuccessful) {
//Success
} else {
//Exception
}
}
即使允许 create: 如果为 true,它也会给出相同的 Missing 或 Insufficient Permission 异常。但是当我将其更改为“允许写入:如果为真”时,它可以工作并添加文档
当我在Rules和Client Code中将集合名称更改为test时,它会在同一个集合中创建新文档,但是当我将集合名称更改为locationData、location和locations时,它将不起作用。
这是 Firestore 规则中的问题还是可以解决这个问题?
解决方案
似乎在尝试将 dataMap 保存到 Firestore 时触发了您的更新规则。
请注意,这add()
基本上是一个doc.set()
.
的行为set()
是,如果文档已经存在,它会尝试覆盖文档,并将执行更新操作,从而触发安全规则中的更新规则。
你有两个选择:
1) 检查您尝试保存的数据是否已存在于位置集合中。
2) 将更新规则设置为允许为真,这样您就可以验证文档是否已经存在。
希望有帮助。
推荐阅读
- html - 图像未显示在 Rich Snippet / Google Schema 中
- ios - 如何在 SkyFloatingLabelTextField 中垂直和水平对齐文本?
- javascript - Javascript没有选择稍后通过javascript使用innerHTML添加的html元素
- vue.js - 如何使用 Vue.Js 从 Store.js 访问 Mixin.js 文件的 $data 变量?
- compiler-errors - 目标文件中未定义的符号
- javascript - Rails 6 webpacker在javascript文件中使用环境变量
- java - 当我尝试使用循环在 excel 工作表中写入行和列时,仅打印最后一个循环值
- spring - Spring Batch Job 实例 ID 有时不会生成
- python - 用命令自动制作按钮
- android - Android 蓝牙 API 与配对手机提供的服务