Firebase数据库规则可防止与另一个节点相关的删除

时间:2019-12-29 15:58:36

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

假设我们有两个节点:“项目”和“销售”。我如何编写firebase db规则以防止删除与另一个节点相关的任何项目。如果用户要删除(“ items \ i01”),则不应授予许可,因为它是(“ sales \ s01 \ i01”)

下的关系
"items": {
   "i01": {
     "name": "item1"
   },
   "i02": {
     "name": "item2"
   },
}

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

1 个答案:

答案 0 :(得分:1)

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


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

"sales_per_item": {
  "i01": {
    "s01": true
  },
  "i02": {
    "s02": true
  }
}

您需要确保在代码和安全规则方面都更新此新结构(有时称为反向索引),使其与sales保持同步。

将其放置在适当的位置,然后可以防止删除仍带有引用的项目:

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

作为替代方案,您可以考虑将删除逻辑移到Cloud Function中,在其中可以用代码而不是安全规则来执行“检查带有该项目的订单”。

我还建议阅读以下内容: