Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于防止删除与其他节点相关的Firebase db规则_Firebase_Firebase Realtime Database_Firebase Security - Fatal编程技术网

用于防止删除与其他节点相关的Firebase db规则

用于防止删除与其他节点相关的Firebase db规则,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,假设我们有两个节点:items和sales。如何编写firebase db规则以防止在其他节点中相关的任何项目被删除。如果用户希望删除项目\i01,则不应授予权限,因为它是sales\s01\i01下的关系 "items": { "i01": { "name": "item1" }, "i02": { "name": "item2" }, } "sales": { "s01": { "itemKey": "i01", "pr

假设我们有两个节点:items和sales。如何编写firebase db规则以防止在其他节点中相关的任何项目被删除。如果用户希望删除项目\i01,则不应授予权限,因为它是sales\s01\i01下的关系

"items": {
   "i01": {
     "name": "item1"
   },
   "i02": {
     "name": "item2"
   },
}

"sales": {
   "s01": {
     "itemKey": "i01",
     "price": "45"
   },
   "s02": {
     "itemKey": "i02",
     "price": "60"
   },
   ...
}

安全规则可以检查数据是否存在于已知路径,但不能跨JSON树的分支执行数据搜索。因此,在当前的数据结构中,无法防止删除仍在引用的项

典型的解决方案是添加一个数据结构,您可以在安全规则中检查该项是否仍然在任何地方被引用。这与您当前的销售节点(跟踪销售中的商品)几乎相反。反向节点将跟踪任何项目的销售情况:

"sales_per_item": {
  "i01": {
    "s01": true
  },
  "i02": {
    "s02": true
  }
}
您将需要确保这个有时称为反向索引的新结构在代码和安全规则中都进行了更新,以便与销售同步

这样,您就可以防止删除仍具有以下引用的项目:

{
  "rules": {
    "items": {
      "$itemid": {
        ".write": "!newData.exists() && !newData.parent().parent().child('sales_per_item').child($itemid).exists()"
      }
    }
  }
}

作为替代,您可以考虑将删除逻辑移动到云函数中,在这里您可以对代码中的项进行检查,而不是在安全规则中进行检查。

我还建议阅读以下内容:


谢谢你的详细答复。在我的例子中,我决定为delete操作创建一个云函数。链接非常有用。