我的应用内容由用户生成。我希望每个用户都能访问和编辑自己的数据(他创建的节点)。因此,如果节点为空,则用户创建“剪辑”节点和“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": {
},
为什么表现如此? 关于如何锁定这个东西的任何想法?
答案 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的类似情况。