假设我们有两个节点:“项目”和“销售”。我如何编写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"
},
...
}
答案 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中,在其中可以用代码而不是安全规则来执行“检查带有该项目的订单”。
我还建议阅读以下内容: