为什么我更新安全规则后无法将数据写入 Firebase

时间:2020-12-27 19:46:30

标签: reactjs firebase google-cloud-firestore firebase-security

我尝试将我的 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,
  });

这是添加新文档的代码..

2 个答案:

答案 0 :(得分:2)

resource.data(实际上是资源对象)表示正在访问的数据库文档。在 create 情况下,它尚不存在,因此无法匹配。对于 create,您需要匹配 request 对象,该对象表示交易后文档的状态。

强烈建议您将规则分别分为 readcreate 等,这样您就可以更轻松地查看正在创建的内容。

此外,文档建议您不要将 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;