我尝试将我的 Firestore 安全规则更新为:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /entries/{entry}{
allow read, create, update, delete, write: if request.auth != null && request.auth.uid == resource.data.user;
//user is a property of every document in my collection which holds the user id of logged user
}
}
}
我的问题是我能够读取、更新和删除数据,但无法在此集合中创建新文档..我做错了什么? 编辑:
console.log(firebaseApp.auth.currentUser.uid)
firebaseApp.db.collection("entries").add({
content: encrypt(entryContent),
time: entryDate.getTime(),
user: firebaseApp.auth.currentUser.uid,
});
这是添加新文档的代码..
答案 0 :(得分:2)
resource.data
(实际上是资源对象)表示正在访问的数据库文档。在 create
情况下,它尚不存在,因此无法匹配。对于 create
,您需要匹配 request
对象,该对象表示交易后文档的状态。
我强烈建议您将规则分别分为 read
、create
等,这样您就可以更轻松地查看正在创建的内容。
此外,文档建议您不要将 write
规则与 create, update, delete
重叠 - 因为前者只是后三者的简写。
答案 1 :(得分:2)
您的规则要求现有文档数据包含一个名为“user”的字段以与用户的 uid 相同:
request.auth.uid == resource.data.user
resource.data
包含正在读取或写入的现有文档的字段。不存在的文档没有 resource.data
的值。因此,如果您创建新文档,这将始终评估为 false。
如果你想允许任意用户创建一个新文档,你应该有一个如下所示的创建规则:
allow create: if true;
如果您想要求用户只能创建具有名为“user”的字段及其 UID 的新文档,则应在创建之前使用 request.resource
查看传入的文档数据:
allow create: if request.resource.data.user == request.auth.uid;