Firebase Security推荐的聊天结构,用于实现lastMessage

时间:2017-02-28 04:36:48

标签: swift firebase firebase-realtime-database firebase-security

所以我遇到了这个帖子。

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
    }

0 个答案:

没有答案