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

尔塞

假设我们有两个节点:“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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Firebase数据库规则:无法读取另一个集合

创建具有相同ID的另一个节点后,如何从Firebase实时数据库中删除一个节点

如何防止使用 Firebase 数据库规则删除节点?

仅在 firebase 实时数据库中的一个节点上禁用读取规则

如何从firebase数据库onClick侦听器中删除最后一个节点?

如何在另一个DataSnapshot中访问Firebase数据库值

将Firebase数据库阵列返回到另一个函数,但返回空

从firebase数据库中删除一个值

Firebase数据库可防止删除节点

Firebase数据库规则以匹配行

如何从 Firebase Functions 将触发器放置到另一个 Firebase 数据库?

我们如何仅将在一个节点添加的新数据项复制到 firebase 数据库中的另一个节点

如何为我的数据库编写 firebase 规则,以防止某些用户能够编写?

如何编写规则以防止从数据库中删除节点

Firebase数据库规则专用节点

Firebase/Android - 检查数据库中的数据是否与同一数据库中的另一个数据匹配

将数据发送到 Firebase 数据库后如何从片段移动到另一个片段?

使用来自 Firebase 实时数据库的查询数据作为另一个函数的输入

Firebase Firestore和Cloud Storage:删除数据库条目及其关联文件都可能导致一个被实际删除,而另一个则未被删除

Firebase数据库删除安全规则

Firebase数据库从最后一个子节点开始遍历子节点

如何在 Firebase 数据库的主节点内创建一个节点?

如何以编程方式将对象放入 firebase 数据库中的另一个对象中?

如何根据另一个值检查 Firebase 数据库中是否存在某个值

在一个活动中将数据写入 firebase 实时数据库并在另一个活动中读取数据

当数据库字典在另一个视图控制器中时,如何向Firebase数据库添加图像URL

从Firebase数据库中删除节点

节点的一个属性的Firebase规则

Firebase Cloud Functions在forEach循环中更改另一个节点的数据