【问题标题】:Firebase Realtime Database prevent delete - based on conditionFirebase 实时数据库防止删除 - 基于条件
【发布时间】:2019-10-01 13:31:53
【问题描述】:

我想根据条件防止删除 Firebase 实时数据库中的数据。 不是作者的用户应该能够更新“注释”,但不能删除它。

我的数据库中有一组“笔记”,其中包含以下规则集。

"notes": {
  ".read": "
    auth.uid !== null //&&
  ",
  "$note_id": {
    ".write": "
      //New data
      !data.exists() && auth.uid !== null ||
      //Existing data
      data.child('access').child('author').val() === auth.uid ||
      data.child('access/members').child(auth.uid).exists()          
    ",
    "data": { .. },
    "access": {
      "author" : { .. },
      "members" : { .. }
    }
  }
}

如何只允许“作者”删除“笔记”?

我曾尝试使用 Google Cloud Functions for Firebase,但只能访问 .onDelete() 事件,该事件在 已执行删除之后运行。我可以为此目的使用 .onWrite() - 如果可以,如何?我已经为数据库中的 /notes 节点实现了 .onCreate() .onUpdate() 和 .onDelete() 的侦听器。

亲切的问候,克米特

【问题讨论】:

    标签: firebase-realtime-database firebase-security


    【解决方案1】:

    无法使用 Cloud Functions 在传入请求影响数据库之前拦截它们。如您所见,它们仅用于后期处理。

    如果安全规则不足以控制您想要的访问方式,请考虑通过检查权限的 HTTP 类型云函数路由请求,然后执行删除或拒绝请求。

    【讨论】:

    • 感谢您的及时回复!这听起来很合乎逻辑。 :) 理想情况下,我希望使用 Firebase 规则,但不确定应该如何编写它们来支持此用例?
    【解决方案2】:

    我猜想一些 Firebase 规则

    ".write" : "
      //Create
      !data.exists() && auth.uid !== null
      //Update
      ||(data.exists() && newData.exists() && data.child('access').child('author').val() === auth.uid || data.child('access/members').child(auth.uid).exists())
      //Delete
      ||(data.exists() && !newData.exists() && data.child('access').child('author').val() === auth.uid)
    "
    

    如果用户不是作者,会阻止删除吗?

    【讨论】: