与父数据匹配的Firestore规则,仅在模拟器中有效

时间:2019-10-13 23:12:25

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

我正在尝试制作一个简单的直接消息部分。我有一个包含一些元信息的文档和一个带有单个消息的子集合。 当我尝试获取消息时,规则在模拟器中有效,但是在js中,我每次都得到:未捕获(承诺)FirebaseError:缺少权限或权限不足

mongodb结构:

  • 聊天室
    • roomId
      • metaInformation(发送者ID /名称,接收者ID /名称,时间戳等)
      • 消息
        • messageId
          • 名称
          • 文本
          • 时间戳

规则:

match /chatRooms/{chatRoom}  {
  allow create: if request.auth.uid != null;
  allow update, delete: if resource.data.uid == request.auth.uid;   

  function isChatPartner() {
   return parentDoc().receiverId == request.auth.uid || parentDoc().senderId == request.auth.uid;
  }

  function parentDoc() {
    return get(/databases/$(database)/documents/chatRooms/$(chatroom)).data;
  }

  match /messages/{message} {
    allow read: if isChatPartner();
  }

}

js请求:

db.collection("chatRoom").doc(_roomId).collection("messages").get().then(msg => {
   console.log(msg);
})

有人知道什么可能是错误的吗?

1 个答案:

答案 0 :(得分:2)

您的数据库和规则不匹配。在规则中,顶层集合称为“ chatRooms”,但是在您的代码中,它称为“ chatRoom”。集合名称必须完全匹配。

还有另一个问题。您的代码试图获取子集合中的所有文档,但是规则不允许这样做。规则正在检查某些字段以供访问。自rules are not filters起,这在安全规则中将无效(请务必阅读并理解这些文档)。查询必须只请求肯定会通过规则的文档-规则不会检查每个文档并排除不匹配的文档。