如何对Firebase节点进行结构化以限制用户访问并允许管理员提取报告数据



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

  • 时间输入

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

    • ClientID
      • 名称、项目等
  • 如果我只是根据用户添加和提取时间条目,这种结构可以很好地工作,但我想开始按每个客户端组合报告。目前,这意味着为每个用户发出一个单独的HTTP请求,然后通过clientID进行过滤以获取数据。

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

    问题:是否有一种方法可以对节点进行结构化,从而限制用户只能管理自己的时间条目,并允许一个查询提取绑定到客户端的所有条目?

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

    @AL。你的答案是我在网上搜索文档后得出的。复制数据是最佳途径。

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

    我这样做的方法是使用Cloud Firestore。

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

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

    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

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

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

    最新更新