嵌套数据结构的Firebase安全规则

时间:2015-07-25 15:49:16

标签: firebase firebase-security firebase-authentication

我正在使用Firebase规则配置来控制对数据库的读/写访问权限。我原本写了更多的规则,但是我在故障排除期间减少了一些事情。这是我当前的规则配置:

{
  "rules": {
   "developers": {
      "$dev": {
        ".write": "!data.exists() && auth != null",
        ".read": "auth.devBucket === $dev",
        "$proj": {
          ".read": "auth.devBucket === $proj",
          "shared": {
            ".write": "!data.exists() || (auth.devBucket === $dev && auth.projBucket === $proj)"
          }
        }
      }
    }
  }
}

我尝试做的是允许Firebase用户创建$dev节点,$proj节点和共享节点,只要它们不存在并且用户已通过身份验证。然后,我希望允许用户在共享节点内具有免费写入权限,只要他们的身份验证令牌的devBucket与他们在其中写入的$dev节点及其身份验证令牌相匹配即可。 s projBucket匹配他们正在写的$proj节点。我使用适用于Android的Firebase自定义身份验证系统,并且已经使用这些devBucket和projBucket变量加载了我的令牌。身份验证肯定会根据我的logcat运行,但我肯定会通过我当前的规则获得权限拒绝错误。我已经在这里倾注了Firebase规则文档和问题好几天了,我仍然对他们的规则系统如何工作的细微差别感到困惑。

根据文档规则在JSON中进行较低级别的嵌套,我很难理解如何编写允许节点及其子节点创建一次的规则,但如果您经过适当的身份验证,也允许在共享下编写或覆盖任意数量的孩子。

有没有人知道如何编写规则来完成我想要做的事情?

编辑:我认为值得一提的是,当我尝试将侦听器指向我的节点时,我的权限被拒绝了。

1 个答案:

答案 0 :(得分:0)

我找到了适合我的配置。

{
   "rules": {
       "developers": {
         ".write": "!data.exists() || auth != null",
         ".read": "auth != null",
          "$dev": {
            ".write": "!data.exists() || (auth != null && auth.devBucket == $dev)",
            ".read": "auth != null && auth.devBucket == $dev",
            "$proj": {
              ".write": "!data.exists() || (auth != null && auth.projBucket == $proj)",
              ".read": "auth != null && auth.projBucket == $proj"
            }
          }
        }
    }
}