当前位置: 首页 > 知识库问答 >
问题:

如何构建Firebase节点以限制用户访问并允许管理员提取报告数据?

彭正谊
2023-03-14

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

>

  • 时间输入

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

        客户

        • 客户ID
          • 名称、项目等

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

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

          问题:是否有一种方法可以构造节点,从而允许用户仅管理自己的时间条目,以及允许一个查询来提取与客户端关联的所有条目?

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

  • 共有2个答案

    宇文航
    2023-03-14

    我这样做的方式是使用Cloud Firest。

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

    在客户机文档中,创建一个子集合,名为timeEntries。当用户对此进行写入时,必须包含一个等于请求的用户ID字段(您可以在规则中强制此字段)。授权。uid

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

    您现在可以创建读取规则,允许管理员查询子集合中的任何文档,但单个用户必须使用userId=request进行查询。授权。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

    夏经武
    2023-03-14

    @艾尔。你的答案是我在网上搜索完文件后得到的答案。复制数据是最好的方法。

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

     类似资料:
    • 我正在尝试建立一个只有我可以编写的Firebase数据库。所以没有用户有权编写任何东西。但每个人都可以阅读它。 然而,我无法为它制定规则。我使用电子邮件/密码登录创建了一个管理员用户,我知道它的UID。假设我的UID是: 我尝试了这两种方法,但它们不允许我写入数据库。 . 那么,如何只允许一个具有特定UID的用户向数据库写入任何内容呢?

    • 我将JSON对象存储在Amazon S3中,我想从Javascript直接从S3加载数据。我的GET看起来很普通: 我得到以下错误: 我可以使用curl从S3获取URL,或者直接从浏览器导航到S3。我真的要通过自己的服务器代理所有这些请求吗?

    • 这个get请求应该包含在响应中,头, 我的桶CORS设置如下所示: 正如您可能期望的那样,没有响应头。

    • 在我的nodejsapi中,我使用这个npm-pkg实现了角色,我还对令牌部分使用了。我的问题是我无法限制基本角色用户更新非他/她自己的帐户。我想实现的是,管理员可以做他想做的任何事情,但作为基本的其他角色是有限的。在我的例子中,我希望具有基本角色的用户能够只更新其拥有的帐户,而不更新任何其他帐户,但现在该帐户不起作用。 在我的邮递员中,我正在用基本角色的令牌调用更新终结点,并尝试更新与令牌不关联

    • 我已经为PostgreSQL创建了新的Azure数据库-灵活的服务器,管理员用户为“admin\u demo”。 现在,在创建数据库之后,我完成了以下步骤: > 创建角色role\u developer;--创建新角色。 授予使用权限,在模式abc上创建以role_developer;--授予对模式中新角色的访问权限。 将架构abc中所有表的select、insert、update、delete授

    • 我当前的Android应用程序使用Firebase实时数据库。 我正在与安全规则作斗争,因为我希望只允许单个用户写入数据,同时允许任何经过身份验证的用户读取数据。 我制定了这些规则,但不确定它们是否足够安全。。。 其中“XXXXXXXXXXXXXXXXXXXX”是我希望允许写入数据的指定用户。 用户的uid是常量值吗? 在测试新规则时,单击“模拟”按钮时,“验证”选项管理什么?