我正在尝试在我正在处理的应用中设置私人聊天功能,并且我在解决数据异常化/正确设置规则方面遇到了一些麻烦。
在做了一些阅读之后,我意识到规则是全有或全无,所以使用过滤规则不是一种选择。
我在纸上概述了我的基本想法,并将其粘贴在下面。基本上会有两条主要路线,用户和聊天。
用户只是一个键控列表,每个键与经过身份验证的用户匹配。然后在列表的每个成员中,我将只有每个聊天,所述用户被列为键。
对于聊天路线,我会列出所有聊天记录。
现在有了规则。
用户只能在密钥与其uid匹配的列表中读取其数据。对于写作我不那么自信。我想我必须让任何有身份验证的人写信,否则开始聊天的用户无法通过在用户路线的聊天列表中播放聊天ID来通知其他人新聊天。
对于聊天规则,只有在用户通过身份验证且聊天密钥位于用户路径中的数据内时,才允许读取和写入。
看起来我是否正朝着正确的方向前进?
users:{
user1:{
chat1: true,
chat2: true
...
},
user2:{
chat1: true,
chat3: true
....
}
}
chats:{
chat1:{
lastUpdate: timestamp,
messages:{
0:{
from: user1
to: user2,
message: some message
}
...
}
}
}
rules:{
.read: false,
.write: false,
users:{
$user_id:{
.read: auth != null && $user_id == auth.uid,
.write: auth != null //not sure here as other users need to write here if the start a new chat
}
},
chats:{
$chat_id: {
.read: auth != null && root.child('users').child($chat_id).contains(auth.id),
.write: auth != null && root.child('users').child($chat_id).contains(auth.id)
}
}
}
答案 0 :(得分:0)
我一直在玩这个,所以这里有一个选项(绝不是我建议这是最好的方法)
规则:
{
"rules":{
".read": false,
".write": false,
"users":{
"$user_id":{
".read": "auth != null && $user_id == auth.uid",
".write": "auth != null" //not sure here as other users need to write here if the start a new chat
}
},
"chats":{
"$chat_id": {
".read": "auth != null && root.child('users').child(auth.uid).child('chats').hasChild($chat_id)",
".write": "auth != null && (root.child('users').child(auth.uid).child('chats').hasChild($chat_id) || !data.exists())"
}
}
}
}
then for users I have a structure like this:
users:{
someUserId:{
chats:{ //embedded a second level so I can save firebaseObj.someUserId to get the keys more easily
someChatId: true //and repeat for each chat
}
}
}
聊天记录是这样的:
chats:{
someChatId:{
//chat data
}
//more chat objects
}
如果有更好的方法可以做到这一点,我不会感到惊讶,但至少这可能是那些陷入困境的人的开始。如果/当我得到更好的解决方案时,我会记得更新这个。