【问题标题】:How can Firebase nodes be structured to restrict user access and allow admin to pull report data?如何构建 Firebase 节点以限制用户访问并允许管理员提取报告数据?
【发布时间】:2023-03-19 12:11:02
【问题描述】:

上下文:我正在使用 Firebase 作为我的后端来构建一个时间跟踪应用程序。我当前的节点结构在根目录中有时间条目和客户端,如下所示:

  • 时间输入

    • 条目 ID
      • 用户 ID
        • clientID、小时、日期、描述等
  • 客户

    • 客户 ID
      • 名称、项目等

如果我只是根据用户添加和提取时间条目,则此结构可以正常工作,但我想开始按每个客户汇总报告。目前,这意味着为每个用户发出单独的 HTTP 请求,然后通过 clientID 过滤以获取数据。

一旦授予父节点访问权限,Firebase 的规则结构就会授予对所有子节点的访问权限,因此一个大列表不起作用,因为它不能限制用户查看或编辑彼此的条目。

问题:有没有一种方法可以构造节点,允许限制用户只管理他们自己的时间条目,并允许一个查询提取与客户端相关的所有条目?

** 我能想到的唯一解决方案是将条目复制到一个仅用于报告目的的节点中,但这似乎不是一个可持续的选择

【问题讨论】:

    标签: firebase firebase-realtime-database


    【解决方案1】:

    @AL。您的答案是我在网上搜索文档后的想法。复制数据是最好的方法。

    新的 Firestore 测试版似乎为此提供了一些解决方法。

    【讨论】:

      【解决方案2】:

      我会使用 Cloud Firestore 来做到这一点。

      为每个客户端创建一个根集合clients 和一个文档。这会将数据划分为易于管理的块,以便客户管理员可以查看其公司的所有数据。

      在客户端文档中,创建一个名为timeEntries 的子集合。当用户写入此内容时,他们必须包含一个等于 request.auth.uid 的 userId 字段(您可以在规则中强制执行此操作)

      https://firebase.google.com/docs/firestore/security/rules-conditions#data_validation

      您现在可以创建读取规则,允许管理员查询 timeEntries 子集合中的任何文档,但单个用户必须使用 userId = request.auth.uid 查询才能仅返回他们创建的条目。

      https://firebase.google.com/docs/firestore/security/rules-conditions#security_rules_and_query_results

      在您的 users/{uid} 集合或 clients/{clientId} 集合中,您可以轻松创建一个标志来识别管理员用户并在读取数据时进行检查。

      https://firebase.google.com/docs/firestore/security/rules-conditions#access_other_documents

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-11
        • 1970-01-01
        • 2018-09-16
        • 2019-07-18
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多