用于 2 个节点的聊天应用程序的 Firebase 实时数据库规则

时间:2021-05-15 14:08:20

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

My Chat 和 Friends 节点当然是分开的,所以在为我的 Chat 编写规则时是否可以参考 Friends 节点。

我目前的聊天规则如下:

"Chats": {
        "$uid_1":{
          "$uid_2":{
           ".read": "auth.uid == $uid_1  || auth.uid == $uid_2", 
           ".write": "auth.uid == $uid_1  || auth.uid == $uid_2 "
          }
        }
    },

数据库中的好友结构

 - Friends

      -uid1
         -uid2
             - username


        -uid2
           -uid1
              - username
    
    

当用户不再是朋友时,我如何确保消息不会通过?我的 android 应用程序中有规则,但被告知我也应该在安全规则中编写它。

2 个答案:

答案 0 :(得分:0)

您可以从 root variable 开始检查数据库中任何位置的数据。

因此,如果您只想允许 uid2 在其 UID 存储在 uid1 的好友列表下的情况下写入 uid1 的消息,您可以检查:

".write": "(auth.uid == $uid_1  || auth.uid == $uid_2) 
           && root.child('Friends').child($uid_1).child($uid_2).exists()"

答案 1 :(得分:0)

你可以试试这些规则:

{
  "rules": {
    "chats": {
      "$uid": {
        "$uid2": {
          ".read": "auth.uid === $uid || auth.uid === $uid2",
          ".write": "auth.uid === $uid && root.child('friends').child($uid).child($uid2).exists()"
        }
      }
    }
  }
}

这仍将保留两个用户的 READ 访问权限,但他们无法写入新消息。

虽然你的数据库结构看起来有点难以存储消息。我相信 chats -> uid 1 -> uid2 不会总是一样的,或者至少你很难维持这样的顺序,比如哪个用户保持第一等等。