如何授予对 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()",
我一直在尝试允许一系列管理员访问他们的数据。 我有这样的数据库结构:
{
"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()",