【问题标题】:Firebase Realtime Database Security Rules for prevent create/delete not working用于防止创建/删除的 Firebase 实时数据库安全规则不起作用
【发布时间】:2021-01-26 21:14:28
【问题描述】:

我在几个地方看到防止创建和删除的方法是使用 data.exists() && newData.exists()。但是当我在这些规则中实现它们时,我仍然可以在登录时根据自己的喜好创建和删除。我做错了什么?我的目标是让经过身份验证的用户更新,而不是创建或删除。

"rules": {
    "listings": {
      ".read": true,
      ".write": "data.exists() && newData.exists() && auth != null",
    },
}

【问题讨论】:

  • 您能否编辑您的问题以同时显示不适合您的写入操作的代码?

标签: firebase-realtime-database firebase-security


【解决方案1】:

我的猜测是您希望允许用户更新特定列表,而不是一次更新所有列表。

在这种情况下,您应该在每个特定列表上定义 .write 规则:

"rules": {
    "listings": {
      ".read": true,
      "$listingid": {
        ".write": "data.exists() && newData.exists() && auth != null",
      }
    },
}

因此,用户可以更新任何现有列表,但不能同时更新所有列表。

【讨论】:

  • 天哪。要么你是天才,要么我很笨。这正是我想要的。当我看到这个时,我正在编辑。为什么我们不能在整个事情上设置写条件?我不知道为什么这些安全规则对我来说如此困难。
  • 可以设置“整个事物”的权限,但这意味着这些权限适用于整个事物。因此,如果您在listings 上设置权限,则data 是写入前所有列表的数据,newData 是写入后所有列表的数据(如果成功)。并且很可能在您的代码中(这是我在评论中要求的)您只是在编写一个列表,因此 datanewData 都将存在,因为除了您正在更新的列表之外,还有其他列表。
  • 好的,我想我明白了。它将数据视为一个整体。然而,以你的方式(我想要的方式),它正在比较它所在的特定列表。否则它会说是啊,以前有数据,现在有数据!真的!灯泡。谢谢。
  • 不客气。 ? 这个确实很难一开始就掌握,我们发现很难用一般的方式解释得比这更好:firebase.google.com/docs/database/security/…