让我们想象一个简单的场景:像这样在树中的firebase中的简单邮件系统:
{
"users":{
"user-0001":{
"mailbox":{
"user-0002":{
"DSdljkdkd333klll":{
"message":"Hi ! I am user-0002 and I sent to user-0001 a message"
},
"JjkJHHH8888Gggg2":{
"message":"Hi ! It's Me, user-0002 again !"
}
}
},
"secretStuff":"Something Private - nobody can write anything here",
"myContacts":"This is my contact list. Obviously just me can access"
},
"user-0002":{
"mailbox":{
"user-0056":{
"DSdljkdkd333klll":{
"message":"Party tonight ! Don't forget !"
}
},
"user-0282":{
"3893NJJj33333eddf":{
"message":"How are you ?"
}
}
},
"secretStuff":"Something Private - nobody can write anything here",
"myContacts":"This is my contact list. Obviously just me can access"
}
}
}
我作为 user-0002 ,我可以在自己的树上书写。
好的,但我应该能够在用户 - * / mailbox / user-0002处写,因为我可以向任何我想要的用户发送消息。当然:我无法访问任何其他密钥。
那么,如何归档这个:我可以在树上和相邻树上写的规则,如上例所示?
答案 0 :(得分:0)
您应该将公共数据和私有数据保存在单独的顶级列表中。所以:
mailboxes
user-0001
user-0002:{
"DSdljkdkd333klll":{
"message":"Hi ! I am user-0002 and I sent to user-0001 a message"
},
"JjkJHHH8888Gggg2":{
"message":"Hi ! It's Me, user-0002 again !"
}
}
user-0002
user-0056:{
"DSdljkdkd333klll":{
"message":"Party tonight ! Don't forget !"
}
},
user-0282:{
"3893NJJj33333eddf":{
"message":"How are you ?"
}
}
contacts
user-0001: "This is my contact list. Obviously just me can access"
user-0002: "This is my contact list. Obviously just me can access"
secrets
user-0001: "Something Private - nobody can write anything here"
user-0002: "Something Private - nobody can write anything here"
现在,您可以根据信息类型保护访问权限,并加载特定类型的信息。
如果您需要特定用户的所有信息,则需要阅读这三个地方的所有信息。但鉴于您通常会为特定用户执行此操作,这些读取不是可扩展性问题。即使您需要多个用户的所有信息,但自Firebase pipelines the requests over a single connection以来通常速度非常快。
另见:
答案 1 :(得分:0)
经过更多研究和测试后,我得出结论认为这应该有用......
{
"rules":{
"users":{
"$uid":{
".write":"$uid === auth.uid",
".read":"$uid === auth.uid",
"mailbox":{
"$uid":{
".write":" $uid === auth.uid"
}
}
}
}
}
}
这意味着:
如果我是user-0001,我可以在/ users / user-0001读取/写入任何内容,但是如果路径是/ users / * / mailbox / user-0001 <我可以在别处写入/ p>