【问题标题】:Firebase Database Delete Security RulesFirebase 数据库删除安全规则
【发布时间】:2016-12-18 20:49:09
【问题描述】:

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

这是我的架构

{
  "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}
        }
      }
    }
  }
}

使用内置模拟器,我得到了以下结果:

这在位置设置为“/folder/item1”和“/folder/item1/dataset1”时有效

如果我在 data1 中有更深的节点,它们都会被删除,因为允许写入。

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

【问题讨论】:

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


    【解决方案1】:

    我不太清楚你在问什么。但是您的规则存在一些问题,因此我将指出这些问题,希望他们能回答您的问题。

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

    我怀疑 #2 导致了您当前的问题。

    【讨论】:

    • 您好,我在第 2 点中使用了您的建议。我使用“newData.hasChildren([example, example])”来确保无法删除这些孩子。感谢您的帮助!