所以我遇到了这个帖子。
Structuring data for chat app in Firebase
我只想为我的firebase数据库结构提供一个示例(在firebase文档中类似)。
{
"chatMetadata": {
"chatroom_id_1": {
"title": "Some Chatroom Title",
"lastMessage": "Some Message",
"timestamp": 1459361875666
"users": {
"uid_1": true,
"uid_3": true
}
},
"chatroom_id_2": { ... }
},
"users": {
"uid_1": {
"chatRooms": {
"chatroom_id_1": true,
"chatroom_id_2": true
},
},
"uid_3": { ... }
},
"chatrooms": {
"chatroom_id_1": {
"m1": {
"name": "uid_1",
"message": "The relay seems to be malfunctioning.",
"timestamp": 1459361875337
},
"m2": { ... }
},
"chatroom_id_2": { ... }
}
}
让我像最近的聊天消息一样实施。我可能需要" / chatMetadata /"数据,因为它有lastMessage
要在客户端中查询它,我们需要上面链接中的答案,仅在一个参考中获取它。
//chatMetaDataRef = root of "chatMetadata"
chatMetaDataRef.queryOrderedByChild("users/uid_3").queryEqualToValue(true)
.observeSingleEventOfType(.Value, withBlock: { snapshot in
// Do something here
})
问题是所有用户都应该具有对#34; / chatMetadata"的读取权限。工作的节点。
这是我的安全规则
{
"rules": {
".read": "auth.uid === 'someServiceWorker'",
".write": "auth.uid === 'someServiceWorker'",
"chatMetadata": {
"$chatroomId":{
".read": "data.child('users/'+auth.uid).exists()"
},
".read": "auth != null"
},
"chatrooms": {
"$chatroomId": {
".read": "root.child('chatMetadata/'+ $chatroomId + '/users/'+auth.uid).exists()",
}
},
"users": {
"$userId": {
".read": "auth.uid === $userId"
}
}
}
}
现在我的问题是我们应该如何为这个实施安全规则,以便用户不能访问所有chatMetadata(因为如果我删除" auth!= null",我上面的查询将不起作用或者,如果不可能,我们应该如何重组数据,以便我们可以单独使用一个参考来查询它?
P.S。
问题的原因是我不喜欢我会循环使用#34; users / $ uid / chatrooms"并查询我从中收到的每个引用。就像上面链接中的第二个答案一样。
for chat in listOfChatsUserIsIn
ref.child("chatMetadata").child("\(chat)").child("lastMessage").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
lastMessage = snapshot
// do something here
}