假设我们有两个节点:“items”和“sales”。我如何编写 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"
},
...
}
安全规则可以检查数据是否存在于已知路径,但不能跨 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 中,您可以在其中在代码中而不是在安全规则中执行“检查商品的订单”。
我还建议阅读这些:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句