我的数据结构如下:
{
"farms" : {
"-J3saHfe8_2GRqn3jOTc" : {
"stockunits" : {
"-J4CAeRI-IKKXVuNILCv" : {
"name" : "Chickens",
"totalStockUnits" : 115
}
},
"owner" : 3,
"name" : "smith"
},
"-J3sbbqsGabs5cLaj0zP" : {
"owner" : 2,
"name" : "brown"
}
}
}
当我查询“/ farms”时,我想获得经过身份验证的用户是所有者的服务器场列表。我还想阻止用户查看他们不是所有者的农场。
我的规则目前看起来像这样:
{
"rules": {
".write": false,
".read": false,
"farms": {
"$farm": {
".read": "data.child('owner').val() == auth.id"
通过将.read放在此级别,我通过/ farms /:farmid访问时授予对单个服务器场的读取权限。如果我将“.read”移动到“farm”级别,则会导致授予对整个列表的读取权限。
所以我认为我需要重构我的数据,但不确定如何最好地解决这个问题?我不想在用户对象下添加farm对象,因为我想要向任何给定的服务器场添加一些“编辑器”用户。
感谢您的帮助
答案 0 :(得分:2)
您需要对数据进行非规范化,并在每个用户的配置文件中包含对各个服务器场对象的引用。在这篇博文中有一个完整的例子说明如何进行这种非规范化:https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html
在该示例中,代码段显示在帖子下组织评论,您可以使用类似的技术将场映射到用户。