我正在使用firebase创建一个简单的聊天应用程序,并且遇到了可用安全设置的一些问题。
此应用程序的数据模型非常简单,如下所示
rooms:[
people:[
{
name: //string
status: // what the user is doing, typing, still connected etc.
secret: // the problem is with this
}
],
messages:[
{/* message to and payload*/}
]
]
问题是我只希望创建房间[i] .people [j]的用户能够更新该人的状态。
成为firebase的新手,虽然我可以使用更新功能,如下所示
personRef.update({
'status': // newStatus
'secret': // used to authorize the update
})
这个问题是我无法找到任何方法来使秘密只写,并同时给予人们访问权限。那就是我需要任何人能够提取位于房间[i] .people的数据 - 意味着房间[i]。人们必须拥有" .read":true(在firebases安全规则中)。但这会给每个孩子提供阅读权限,房间里的任何人都可以看到任何其他人的更新秘密。我错误地想到了这个问题吗?
有没有办法给父母提供读取权限,但是从结果中排除了一些孩子?
谢谢!
答案 0 :(得分:2)
这取决于你如何使用秘密来实现授权,但我怀疑对数据进行非规范化是有用的。尝试这样的事情:
people-secrets:[
<user's ID>: {
secret:
}, ...
],
rooms:[
people:[
{
name: //string
status: // what the user is doing, typing, still connected etc.
}
],
messages:[
{/* message to and payload*/}
]
]
这将允许您细分安全规则:
{
"rules": {
"people-secrets": {
"$user_id": {
".read": "$user_id === auth.uid",
".write": "$user_id === auth.uid"
}
},
"rooms": {
"$room_id": {
"$user_id": {
".read": "auth.uid != null",
".write": "$user_id === auth.uid && root.child('people-secrets/' + auth.uid + "/secret") === <that token>"
}
}
}