Firebase 实时数据库安全规则 - 如何进入第二个节点

Firebase Realtime Database Security Rules - How to get into second node

我正在为 firebase 实时数据库的安全规则而苦恼。我的数据库结构如下:

第一层有聊天功能。第二层是聊天伙伴(聊天伙伴的用户 ID 的串联字符串)。在第三层你有信息。在最后一层有变量 datetime、userid 和 message。

我的问题是,如何进入第二个子节点,例如检查 auth.uid 是否在连接字符串中。我的想法是,如果用户 ID 在 chatpartners 字符串中,则授予用户读取权限,以确保只有 chatpartners 可以阅读他们的消息。或者这是一个思维错误? 我尝试了很多东西,但是没有成功:

"Chats":{
   ".read": "root.child('Chats').val().contains('auth.uid')"    
 }

#更新

{
 "rules": {
   "Chats": {
     "$chatid": {
      ".read": "$chatid.contains(auth.uid)",
      ".write": "auth != null"
      }
   },
   "Suchencards": {
      ".read": "true",
            ".write": "auth != null"
   },
   "UserData": {
     "$uid": {
      ".read": "$uid === auth.uid",
            ".write": "$uid === auth.uid"
     }
   }
 }
}

我在 firebase 控制台上使用 playground 来检查我得到的是真还是假,但是在那种情况下我得到的是假。

#更新 2

Screen1

Screen2

如果您知道数据的确切路径,您只能访问规则中的数据,因此您将无法通过 /Chats 上的规则访问所有聊天。尝试这样做通常意味着您试图在错误的级别上定义规则。

例如,如果您希望允许用户阅读 Chats 的特定子项,则需要在该级别定义规则:

"Chats":{
  "$chatid": {
    ".read": "$chatid.contains(auth.uid)"
  }
}

虽然以上方法适用于访问特定房间,但您无法使用它来查询用户有权访问的所有聊天室(因为 Firebase 查询不支持“包含”操作) .在这里查看我的回答中的 userChatrooms 节点,以获得更好的跟踪用户聊天室的模型: