【问题标题】:How to read data based on nested property in firebase database?如何根据firebase数据库中的嵌套属性读取数据?
【发布时间】:2018-01-09 12:26:37
【问题描述】:

我目前有一个具有以下结构的 firebase 数据库:

SharedGroup
 groupid1
     group: "test"
     members
        lastname,firstname@gmail,com: true
 groupid2
     group: "test new"
     members
        last,name@gmail,com: true
 groupid3
     group: "Family"
     members
         lastname,firstname@gmail,com: true
         last,name@gmail,com: false
         nobody@gmail,com: false
 groupid4
     group: "Friends"
     members
         lastname,firstname@gmail,com: true
 groupid5
     group: "Others"
     members
         nobody@gmail,com: true
Users
 9ybmUqR0SzLFA3aZSLV42nPp1lj2
     email: "last,name@gmail,com"
 lNZx6z7PZOUGUY0H3rtbFCYzmO53
     email: "lastname,firstname@gmail,com"

我想设置一个读取规则,如果 SharedGroup 不是成员(电子邮件设置为 true),则不允许用户读取 groupid。我设法设置了如下读取规则:

"SharedGroup" : {
  "$group_id": {
  ".read": " data.child('members').child(root.child('Users').child(auth.uid).child('email').val()).val() === true "
  }
}

如何在 javascript 中读取与特定成员关联的所有 groupid?使用模拟器,从 SharedGroup 读取时出现错误,因为我在该级别没有任何规则。

【问题讨论】:

    标签: firebase-realtime-database firebase-security


    【解决方案1】:

    如果用户无权访问所有项目,则无法在实时数据库中查询项目子集。

    好消息是有两种解决方法:

    1. 为 Firebase 设置云函数,获取 SharedGroup/{groupId}/members/{memberEmail} 的更新,并在 Indexes/groups/{userId 等数据库位置创建索引或组的副本}/{groupId}。

    2. 切换到 Firestore。

    Firestore 类似于 RTDB,但在大多数方面都更好——而且仍处于测试阶段。您不需要访问集合中的每个文档来拉下您有权访问的文档。将您的读取规则设置为:
    allow read: if resource.data.members[request.auth.email]

    让您的查询检查members.email == true。这应该一切正常。

    顺便说一句,如果您可以管理的话,我通常建议使用 userIds 而不是电子邮件地址。

    任何这些方法的一个缺点是每个成员都可以看到每个其他成员是谁。如果您不想这样,则必须设置一个 GroupMembers 集合,其中每个文档都是一个(用户、组)对。这在概念上并不难,但魔鬼在细节中。你可以在a forum post I made 中看到我所说的“访问”对象。

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多