【问题标题】:Firebase security rules for admin read only even though they're set to false管理员的 Firebase 安全规则只读,即使它们设置为 false
【发布时间】:2018-05-30 01:01:33
【问题描述】:

我的应用中有一个节点,用户可以写入但不能读取。

let specialNodeRef = dbRef.child("specialNode").childByAutoId()
specialNodeRef.updateChildValues(dict)

有没有一种方法可以设置规则,以便只有管理员可以从该节点读取,即使规则在使用控制台之外设置为 false?

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
      }
    },
    "specialNode": {
        ".read": false, // users can't read but admin can
        ".write": "auth.uid != null"
    }
  }
}

【问题讨论】:

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


    【解决方案1】:

    运行 Firebase Admin SDK 或通过 Firebase 控制台访问数据库的用户可以使用管理权限访问数据库。它们始终可以读/写,因此不受".read": false 的影响。

    如果您想声明应用程序的一个/部分用户具有特定权限,您可以在规则中包含他们的 Firebase 身份验证 UID:

    ".read": "auth.uid = 'uidOfLance'"
    

    更灵活一点的方式是将每个此类用户的 UID 以如下形式存储在数据库中:

    "admins": {
      "uidOfLance": true,
      "uidOfPuf": true
    }
    

    然后您可以在安全规则中检查 UID:

    ".read": "root.child('admins').child(auth.uid).exists()"
    

    【讨论】:

    • 如果我在我的设备上运行应用程序并且我想绕过规则,我该怎么做呢?那是我迷失的部分。基本上在 m 设备上,我也可以写入该节点,但我也可以从中读取。我想避免那部分的控制台。
    • 我想我们可能在这里谈论的是不同的“管理员”。什么定义了您的应用的管理员?是否只有您自己,例如具有特定 UID 的 Firebase 身份验证用户?
    • 是的,我很抱歉不清楚。我是唯一可以访问数据库的人。啊哈,我知道你在做什么。我可以这样做: "specialNode": { ".read": "false || auth.uid === 'mySpecificUID'", ".write": "auth.uid != null" }
    • 是的,这是最简单的方法。或者,列出此类 UID(例如,将 "uidOfLance": true 存储在 /admins 下),然后签入规则:".read": "root.child('admins').child(auth.uid).exists()"
    • 非常感谢您的大力帮助! :)
    猜你喜欢
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2016-07-09
    • 2020-02-28
    • 2017-06-09
    相关资源
    最近更新 更多