如何授予对 Firebase 数据库规则的管理员数组的访问权限

How can I grant access to array of admins on Firebase database rules

我一直在尝试允许一系列管理员访问他们的数据。 我有这样的数据库结构:

{
    "Respondents": {
        "Acme Corp": {
            "admins": ["mMK7eTrRL4UgVDh284HntNRETmx1", ""mx1TERNmMK7eTrRL4UgVDh284Hnt"],
            "data": {data goes here...}
        },
        "Another Inc": {
            "admins": ["Dh284HmMK7eTrRL4UgVDh284HntN", ""x1TERNmx1TERNmMK7eTrRL4UgVDh"],
            "data": {their data goes here...}
        }
    }
}

然后我尝试像这样设置我的规则

{
  "rules": {
    "Respondents": {
      "$organisation" : {
        ".read": "root.child('Respondents').child($organisation).child('admins').val().includes(auth.id)",
        ".read": "root.child('Respondents').child($organisation).child('admins').val().includes(auth.id)"
      }
    }
  }
}

..但这不会在 Firebase 数据库规则编辑器中解析 我得到 "Error saving rules - Line 7: No such method/property 'includes'",但我需要一些东西来匹配用户 ID 和管理员数组。 有什么经验或建议吗?

如您所见,Firebase 的安全规则中没有 includes() 操作。这是因为 Firebase 实际上并未将数据存储为数组。如果您查看 Firebase Database console or read this blog post,您会看到 Firebase 将其存储为常规对象:

"admins": {
  "0": "mMK7eTrRL4UgVDh284HntNRETmx1",
  "1": "mx1TERNmMK7eTrRL4UgVDh284Hnt"
}

因为这是一个常规的 JavaScript 对象,所以没有 contains() 方法。

一般来说,创建数组是 Firebase 数据库中的一种反模式。它们通常是错误的数据结构,并且在使用时通常是可伸缩性问题的主要原因。

在这种情况下:您并不是真的要存储一系列 UID。事实上:UID 的顺序无关紧要,每个 UID 最多只能在集合中有意义地出现一次。因此,您要存储 set 个 uid,而不是数组。

要在 Firebase 中实现集合,您可以使用此结构:

"admins": {
  "mMK7eTrRL4UgVDh284HntNRETmx1": true, 
  "mx1TERNmMK7eTrRL4UgVDh284Hnt": true
}

价值并不重要。但是因为你必须有一个值来存储一个键,所以使用 true 是惯用的。

现在您可以测试 admins 下是否存在具有相关 UID 的键 (而不是检查它是否包含值):

"root.child('Respondents').child($organisation).child('admins').child(auth.uid).exists()",