我正在使用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].peoples[j]的用户能够更新此人的状态。
作为firebase的新手,我想我可以使用如下的更新功能
personRef.update({
'status': // newStatus
'secret': // used to authorize the update
})
问题是,我找不到任何方法让秘密只写出来,同时允许人们访问。也就是说,我需要任何人都能够提取位于房间[I].peoples的数据——意思是房间[I].Peoples必须具有".read":true(在firebases安全规则中)。但这将为每个孩子提供阅读权限,房间里的任何人都可以看到其他人的更新秘密。我是不是想错了这个问题?
有没有一种方法可以让家长进行阅读,但将一些孩子排除在结果之外?
谢谢!
这在一定程度上取决于您如何使用机密来实现授权,但我怀疑取消规范化数据会起到作用。试试这样的东西:
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>"
}
}
}