如何允许创建者创建,更新和删除节点,而不是Firebase中的其他用户创建,更新和删除节点?

时间:2018-04-15 22:07:05

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

我的应用内容由用户生成。我希望每个用户都能访问和编辑自己的数据(他创建的节点)。因此,如果节点为空,则用户创建“剪辑”节点和“clipOwners”节点,并且如果他是所有者,他还应该也能够更新这些节点和子节点中的任何节点。如果已经采用节点pushKey(即“$ 11111111”),则另一个用户不应该能够创建新节点。 这是我的数据库结构:

                 clips {
 variable Key >>>   "111111111111" : {
                      "MACaddress" : "111111111111",
                      "comments" : "",
                      "created" : "Mon Apr 16 2018 12:40:13 GMT+0100 (BST)",
                      "inRoom" : "-LADDm48Uqabm1bcQGOw",
                      "ins" : {
                         "1523878813443" : true
                      },
                      "name" : "1",
                      "outs" : {
                         "1523878813443" : true
                      },
                      "ownerID" : "QpMHsVHHRrMvk92rbSQvcYEv4en1"
                   },
                   "222222222222" : {
                      "MACaddress" : "222222222222",
                      "comments" : "",
                      "created" : "Mon Apr 16 2018 12:40:13 GMT+0100 (BST)",
                      "inRoom" : "-LADDm48Uqabm1bcQGOw",
                      "ins" : {
                         "1523878813443" : true
                      },
                      "name" : "1",
                      "outs" : {
                         "1523878813443" : true
                      },
                      "ownerID" : "QpMHsVHHRrMvk92rbSQvcYEv4en1"
                   }
                },


                 "clipOwners" : {
                     "111111111111": "QpMHsVHHRrMvk92rbSQvcYEv4en1"           
                     "222222222222": "QpMHsVHHRrMvk92rbSQvcYEv4en1", 
                 }

我正在尝试这个但是如果另一个用户试图写入相同的$ MACaddress,那么“ownerID”子节点会继续被另一个用户更新:

    "clips": {  
        ".read": "true",
        ".write": "!data.exists() || newData.exists()",
        "$MACaddress":{
          "ownerID": {
              ".validate": "!data.exists() || newData.val() === root.child('clipOwner').child($MACaddress).val()",

            }
        }
    },
    "clipOwners": {
      ".read": true,
      ".write": "newData.exists()",
      "$MACaddress": {

      },

为什么表现如此? 关于如何锁定这个东西的任何想法?

1 个答案:

答案 0 :(得分:1)

在您当前的写规则中,您只检查数据是否存在。在这个答案中,我将只关注写规则,以确保您不能有重复的键(请参阅clipOwners规则),并且您只能写入您自己的数据(请参阅剪辑规则):

"clipOwners": {
  ".read": true,
  "$MACaddress": {
      //Only create or delete are possible and value is the user uid
      ".write": "(!data.exists() || !newData.exists()) && (newData.val() == auth.uid || data.val() == auth.uid)"
  }
},
"clips": {  
    ".read": "true",
    "$MACaddress":{
      //The $MACaddress has to exist in the clipOwners node and its value has to be the user uid
      ".write": "root.child('clipOwners/'+$MACaddress).exists() && root.child('clipOwners/'+$MACaddress).val() == auth.uid"
    }
}

编写时首先必须在clipOwners节点中编写$ MACaddress,因为这将用于检查用户是否可以写入剪辑节点。

您可以查看these docs的类似情况。