是的,这绝对可以使用Firebase Database Rules
您所描述的内容似乎包含三个部分,但我们将它们组合起来也会影响您编写它们的方式。
我将从分别回顾这 3 个部分开始,然后将它们组合起来。
只有登录用户才能读/写
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
通过将此设置在您的规则的顶层,您将防止未通过受支持的 Firebase 身份验证方法之一登录的任何人进行任何读取或写入。
用户修改用户条目
{
"rules": {
"users": {
"$uid": {
".write": "auth.uid === $uid"
}
}
}
}
这指定在用户路径下,对于每个用户id(使用$uid语法将其指定为以后使用的变量),仅当当前认证的用户id与相同的id匹配时才允许写入。
订单的管理员控制
{
"rules": {
"orders": {
".read": "auth != null && auth.token.isAdmin",
".write": "auth != null && auth.token.isAdmin"
}
}
}
我们对orders 采取与users 条目类似的方法,但我们不检查用户ID,我们只是说只有管理员可以在orders 下的任何位置进行读写。
把它们放在一起
现在,如果这些规则以某种方式结合在一起,使得更具体的规则覆盖不太具体的规则(例如 CSS 选择器),那么我们可以像这样简单地将上述所有规则合并在一起:
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"orders": {
".read": "auth != null && auth.token.isAdmin",
".write": "auth != null && auth.token.isAdmin"
},
"users": {
"$uid": {
".write": "auth.uid === $uid"
}
}
}
}
然而,Firebase 数据库规则在某种程度上与此相反。在较浅的规则中提供访问将覆盖任何试图拒绝访问的较深的规则(尽管可以在较深的规则中授予更多权限)。因此,上述内容实际上会为任何登录用户提供对整个数据库的完全读/写访问权限。
有鉴于此,我们在组合这些时需要更加小心,以确保我们单独的意图保持有效。最重要的是,第一部分仅登录用户读/写 将是需要修改的部分,因为它位于顶层。
幸运的是,无论如何,我们在第 2 部分和第 3 部分中的规则处理了我们从第 1 部分中获得的大部分内容。仅当您的数据库中只有 orders 和 users 时才适用。我们唯一缺少的是users 上的read 规则。不完全清楚你想要什么样的规则来读取用户数据,因为你只指定一个用户只能写他或她自己的数据,所以我假设所有登录的用户都可以读取用户数据。
然后合并变成:
{
"rules": {
"orders": {
".read": "auth != null && auth.token.isAdmin",
".write": "auth != null && auth.token.isAdmin"
},
"users": {
".read": "auth != null",
"$uid": {
".write": "auth.uid === $uid"
}
}
}
}
请注意,如果您有 read 和/或 write,则需要在数据库的其他节点中复制 auth != null 规则,因为这里您只炫耀 orders 和 users .
希望有帮助!