我想要实现的目标:
我有一份患者列表,不同的用户可以访问它们。因此我在Firebase中有这个结构
所有患者均为患者参考。 所以基本上,我想检索与用户的UID密钥相匹配的患者。 理想情况下,我将在读/写/详细信息部分上过滤该数据,因为例如秘书将具有修改联系人数据但不能访问详细信息的书面权限,而学徒则具有完整的详细信息而没有修改权限。 / p>
我拥有的(不起作用):
var patientsRef = firebase.database().ref('patients').orderByChild('users').orderByKey().equalTo(uid);
问题在于:我无法在文档中找到对我的问题的适当引用。我做错了什么?
答案 0 :(得分:3)
通常建议使用这种嵌套结构使用Firebase。它使得查询几乎不可能(正如您所经历的那样),以及对患者数据应用任何访问控制。
请记住,查询需要对父节点的读访问权限,如果授予该访问权限,则永远不会隐藏任何子数据。
典型的解决方案是将患者 - 用户关系转移到单独的根节点。如果存在匹配关系(ACL)节点,则实际患者数据应该只能逐个读取。
最好"反转"这种关系:每个用户存储患者,而不是每个患者的用户,因此您的应用程序可以直接将它们显示为列表。
提案:
<sc.variable name="dataFolder" value="C:\Inetpub\wwwroot\sitecoredev\Data\"/>
您的应用程序将加载/patients
/PATIENTID1
... sensitive data
/PATIENTID2
... sensitive data
/users
/USERID1
...
/USERID2
...
/user-patients
/USERID1
/PATIENTID1
"name": "Patient name" (redundant copy for easy display)
"detail": true,
"write": false,
...
以显示当前用户可以访问的患者的个性化列表。安全规则也可以直接使用它(使用/user-patients
变量)来确保没有人读取或写入它们不应该的内容。
答案 1 :(得分:1)
编辑:阅读此答案的评论主题,了解为什么不应该这样做。请参阅vzsgs答案。
我建议在json中添加一个不同的部分,以便可以查询它。 firebase的一个要点是将数据结构化以便于查询,因此有时您必须复制数据。 (下次粘贴你的json)。
{
"c237CV45SbhHfaRoicVyvFuy8e88" : {
"firstName" : "Emeline",
"gender": "f",
"lastname": "Zagaroli",
"users": {
"p0R3CV45SBgGfaRoicVyvFuy8tq1": {
"detail": true,
"read": true,
"write": true
}
},
"usersAssoc": {
"p0R3CV45SBgGfaRoicVyvFuy8tq1": true
}
}
}
通过这种方式,您可以编写如下查询:
var patientsRef = firebase.database().ref('patients').orderByChild('usersAssoc/p0R3CV45SBgGfaRoicVyvFuy8tq1').equalTo(true);