【问题标题】:Allow only admins to write data - Firebase Realtime Database - Security Rules仅允许管理员写入数据 - Firebase 实时数据库 - 安全规则
【发布时间】:2020-11-22 07:32:44
【问题描述】:

我只想向具有 isAdmin:true 的经过身份验证的用户授予 .write 权限 下面是数据库的结构。 在 clients(users) 节点中,uid 是 Firebase 生成的身份验证 uid。

{
  "clients" : {
    "-M8bGQaB....." : {
      "isAdmin" : true,
      "uid" : 5gvR1GzT...
     }
   },
  "products" : {
    "-M81GzT....." : {
     "productName": "Product 1"
      },
    "-M81GzT....." : {
     "productName": "Product 2"
    }
}

【问题讨论】:

  • 请编辑问题,以更清楚地解释什么不符合您的预期。如果没有将要访问数据库的代码,规则就没有任何意义。由于您使用 Cloud Functions 进行了标记,因此请在此处说明该产品是如何涉及的。
  • 嘿!错误添加了 Cloud Function 标签。删除它。

标签: firebase firebase-realtime-database firebase-authentication firebase-security


【解决方案1】:

使用您当前的数据结构,无法在安全规则中查找用户配置文件,因为安全规则无法搜索所有用户。

这就是存储用户的正确数据结构使用其 UID 作为键的原因。在你的情况下,看起来像:

  "clients" : {
    "5gvR1GzT..." : {
      "isAdmin" : true
     }
   },

使用此 JSON,您只能在用户 UID 的 isAdmin 属性设置为 true 时允许用户编写产品:

{
  "rules": {
    "products": {
      "$productid": {
        ".write": "root.child('clients').child(auth.uid).child('isAdmin').val() == true"
      }
    }
  }
}

【讨论】:

  • 嗨弗兰克,有什么办法可以在 .child() 中指向通配符吗?例如,root.child($id).val() - 像这样?
  • 不,因为规则引擎无法知道在那里使用哪个节点。任何需要 Firebase 扫描大量节点以查找规则的操作都不会扩展,因此不允许这样做。这就是为什么我不得不在我的回答中更改您的数据模型。
猜你喜欢
  • 2021-06-24
  • 2022-11-11
  • 1970-01-01
  • 2020-08-08
  • 2021-02-20
  • 1970-01-01
  • 2019-10-11
  • 2020-06-09
相关资源
最近更新 更多