我目前有一个具有以下结构的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读取时出错,因为我没有在该级别的任何规则。
答案 0 :(得分:0)
如果用户无权访问所有项目,则无法在实时数据库中查询项目的子集。
好消息是有两种解决方法:
为Firebase设置云功能,以获取对SharedGroup / {groupId} / members / {memberEmail}的更新,并在数据库位置(如Indexes / groups / {userId)创建该组的索引或副本} / {的groupId}。
切换到Firestore。
Firestore就像RTDB一样,但在大多数情况下更好 - 而且还处于测试阶段。您无需访问集合中的每个文档即可下载您有权访问的文档。将您的阅读规则设置为:
allow read: if resource.data.members[request.auth.email]
让您的查询检查members.email == true
。那个 应该所有工作。
顺便说一下,如果你能管理它,我通常建议使用userIds而不是电子邮件地址。
任何这些方法的一个缺点是每个成员都可以看到每个其他成员是谁。如果您不想这样,则必须设置GroupMembers集合,其中每个文档都是(用户,组)对。这在概念上并不强硬,但魔鬼在于细节。您可以在a forum post I made中看到其中一些关于我称之为“访问”对象的内容。