【问题标题】:Firestore - Giving access to subcollection will also give access to the parent collection?Firestore - 授予对子集合的访问权限也将授予对父集合的访问权限?
【发布时间】:2022-01-09 05:14:38
【问题描述】:

我正在使用 firebase 开展一个项目,每个用户都将拥有一本书。每本书里面都有很多章节。我希望每个用户都能够与任何数量的其他用户共享任何章节。我当前的层次结构是/books/{id}/chapter/{id}

我的问题是,如果我让另一个用户访问/books/{id}/chapter/{id},他是否也可以访问books/{id}

所以我需要编写一个 firebase 规则,允许访问子级但阻止访问父级。这是默认行为还是我需要做其他事情?

【问题讨论】:

    标签: firebase google-cloud-firestore authorization backend


    【解决方案1】:

    我的问题是,如果我将 /books/{id}/chapter/{id} 的访问权限授予另一个用户,他是否也可以访问 books/{id}?

    不,这不会发生。

    如果没有明确允许访问任何文档的规则,则没有人可以访问它。匹配嵌套文档的规则不匹配父文档。

    如果您想测试您的规则是否按您期望的方式工作,您应该编写代码以查看在实践中是否确实发生了这种情况。这是您可以确保您的规则按您期望的方式运作的最佳方式(并且您不必在互联网上听取陌生人的建议)。有一个测试库和模拟器。请阅读文档以了解其工作原理。

    https://firebase.google.com/docs/firestore/security/test-rules-emulator

    您还可以使用 Firestore 控制台测试您的规则是否按预期工作。

    【讨论】:

    • 谢谢,是的,我们已经设置了模拟器,但是在开始编写代码之前我们正在计划一下。我们肯定会做很多测试:)
    【解决方案2】:

    没有。您必须将您的安全规则设置为只允许用户读取子集合,如下所示:

    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /books/{bookId} {
          allow read: if false; // Rules for who can read books
          match /chapters/{chapterId} {
            allow read: if true; // Rules for who can read chapters
          }
        }
      }
    }
    

    allow read: if true; 仅适用于这里的章节子集合。

    【讨论】:

      【解决方案3】:

      TL;DR:没有。

      访问权限仅在您使用recursive wildcard rule 时由子集合继承,并且不能向上“继承”。如果您想授予用户访问父书的权限,则必须授予他们对该集合的权限。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-05
        • 2018-12-20
        • 2013-10-16
        • 2021-02-25
        相关资源
        最近更新 更多