2016-12-18 129 views
0

我目前正在创建Firebase安全规则,以防止用户将节点设置为空并删除该节点中的所有数据。Firebase数据库删除安全规则

这是我的架构

{ 
    "folder" : { 
    "item1" : { 
     "dataset1" : { 
     "data1" : 123, 
     "data2" : 456, 
     "data3" : 789 
     } 
    } 
    } 
} 

这是我的规则

{ 
    "rules": { 
    "folder": { 
// users cannot delete items in the node folder 
     ".write": "newData.exists()", 
// item is a variable 
     "$item": { 
     "dataset1": { 
//  dataset1 must have certain nodes and can't be deleted (set to null) 
      ".validate": "data.hasChildren(['data1', 'data2', 'data3']) && newData.exists()", 
      "data1": {".validate": "newData.isNumber()"}, 
      "data2": {".validate": "newData.isNumber()"}, 
      "data3": {".validate": "newData.isNumber()"}, 
//  using the variable $other means any node that isn't data1, data2, data3 is denied 
      "$other": {".validate": false} 
     } 
     } 
    } 
    } 
} 

使用内置的模拟器我得到这些结果:

The write is properly denied and doesn't let user set folder node to null

这工作时,位置设置为“/ folder/item1”和“/ folder/item1/data” SET1"

However when location is set to "/folder/item1/dataset1/data1" the write is allowed and the data is deleted.

如果我在Data1有更深层次的节点,他们将全部被删除,因为写是允许的。

感谢您阅读。打开任何答案,最好我不需要更改架构。

回答

0

我不清楚你在问什么。但是你的规则存在一些问题,所以我只是指出那些希望他们回答你的问题。

  1. 您授予/folder的写入访问权限,您无法在较低级别上将其删除。
  2. 只要有任何数据仍在/folder之下,则允许进行任何写入。需要记住的一点是,newData是该位置处的数据,因为在写入操作后它将存在;它不仅仅是写入的新数据。
  3. 我的印象是你试图阻止.validate规则的删除。请记住,删除数据时不会执行验证,因此您不能使用.validate规则来防止删除。

我怀疑#2是造成你目前的问题。

+0

嗨,我在第2点使用了你的建议。我用“newData.hasChildren([example,example])”来确保这些孩子不能被删除。谢谢你的帮助! –