【问题标题】:Why isn't my Firestore Security rule cascading downward?为什么我的 Firestore 安全规则没有向下级联?
【发布时间】:2020-09-10 21:23:20
【问题描述】:

我不知道如何编写反映以下内容的 Firestore 规则:“当用户从 messages 集合中请求文档时,请检查该“消息”集合上方的文档是否包含一个字段,该字段包含他们的 uid。我已经获得了在顶层工作的规则,但是如果我尝试访问集合中的文档,该集合位于“聊天”集合中,用户将被拒绝。

这是我的相关规则:

match /chats/{chatId}/{allChildren=**} {
  allow read, update: if request.auth.uid in resource.data.usersUids;
}

这可行(chatId 文档有一个 uid 数组):

await db.collection("chats").doc(chatId).get()

这不起作用(所有消息都没有 uid 数组):

await db.collection("chats").doc(chatId).collection("messages").get()

问题的核心似乎是我试图获取messages 集合的resource.data,而不是chatId 文档的资源,但我无法解决这个问题.

【问题讨论】:

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


    【解决方案1】:

    resource 仅包含整个路径匹配的特定文档中的数据。它不包含该路径中出现的任何父文档中的任何内容。

    任何时候您想使用与完整路径不匹配的文档中的字段,您必须使用 documentation 中所述的自己的完整路径来get() 文档。例如:

    match /chats/{chatId}/{allChildren=**} {
      allow read, update: if request.auth.uid in get(/databases/$(database)/documents/chats/$(chatId)).data.usersUids;
    }
    

    【讨论】:

    • 谢谢,Doug,这行得通。我唯一要提到的是,我还必须遵守原始规则:allow read, update: if request.auth.uid in resource.data.usersUids 以覆盖我在所有聊天中的.where 通话。
    猜你喜欢
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2018-10-19
    • 2019-07-05
    • 2021-07-14
    • 2021-07-23
    相关资源
    最近更新 更多