我要实现的目标是向经过身份验证的用户显示与其他用户共享的“事件”列表,特别是仅显示用户本身所属的事件。
我想到的初始结构是:
events:{
"eventId1":{
"title":"some text",
"members":{
"myAuthUID":true,
"anotheUserUId":true
}
}
"eventId2":{
"title":"some text",
"members":{
"anotheUserUId":true
}
}
}
我实施的规则如下。但它失败了porpouse:
{
"rules": {
".read":"auth.uid !== null",
".write": "auth.uid !== null",
"events":{
"$evtId":{
".read":"data.child('members').child(auth.uid).exists()",
".write": "data.child('admins').hasChild(auth.uid)",
}
}
}
}
调用/事件所有事件都是showm
使用myAuthUID调用/ events / eventId2成功。
结果必须是,只显示eventId1到muAuthUser
您能帮我更好地构建数据模型和/或退还规则吗?
同时我会寻找这个简单问题的解决方案:)
感谢
答案 0 :(得分:1)
首先:顶级".read":"auth.uid !== null"
表示所有经过身份验证的用户都可以读取整个数据库。一旦您在数据库中授予某个级别的许可,您就无法在较低级别获得该许可。因此,.read
/events/$evtId
的{{1}}规则目前无用。
下一步是rules are not filters。附加监听器时,Firebase会检查您的规则,并且将在那时(并且仅在那时)评估整个条件。实际上,这意味着安全规则不能用于过滤数据。之前经常有人问这个问题,所以我建议您查看一些previous questions on the topic。
最近,Firebase添加了保护您在某个节点上允许的查询的功能。因此,您可以允许从/users
读取,但只有在他们对特定属性进行排序/过滤时才允许读取。有关详细信息,请参阅documentation on query based rules。但是,我不确定这是否会允许您的用例。之前有一个类似的问题,所以我建议也监听那个,以防有人在那里回答:How to filter by orderByChild containing a string in Firebase query-based rules
我对您的用例的常用解决方案:您当前的数据模型允许您有效地读取/查询事件的成员。它不允许您有效地读取成员的事件。要允许后者,请添加其他数据结构:
members
memberId1:
events
eventId1: true
eventId2: true
memberId2:
events
eventId1: true
eventId3: true
现在这更容易保障。