为了安全起见,如何在不分离每个字段的情况下创建Firebase表?

为了安全起见,如何在不分离每个字段的情况下创建Firebase表?,firebase,firebase-security,Firebase,Firebase Security,因此,我正在深入研究Firebase安全规则,据我所知,树中较高位置指定的规则会进一步向下级联到树中 因此,我想知道是否有一种方法可以让案例工作,我基本上有一个/bands子树,我想让任何人都可以写,但是有管理员和成员子树,我只想根据特殊条件写 到目前为止,这是我一直在做的事情: { "rules": { ".read": "auth != null", "bands": { "$bandId": { ".write": "auth !==

因此,我正在深入研究Firebase安全规则,据我所知,树中较高位置指定的规则会进一步向下级联到树中

因此,我想知道是否有一种方法可以让案例工作,我基本上有一个
/bands
子树,我想让任何人都可以写,但是有
管理员
成员
子树,我只想根据特殊条件写

到目前为止,这是我一直在做的事情:

{
  "rules": {
    ".read": "auth != null",
    "bands": {
       "$bandId": {
          ".write": "auth !== null",
          "$bandId": {
            ".write": "auth !== null && data.child('creator_id').val() === auth.uid"
          }
       }
     }
  }
}
当我在Firebase模拟器中测试“写入”时,类似于
/bands/-KnLeIHM4zCspwBZjZP9
,其中
创建者id
与我提供的指定
auth.uid
不匹配,由于
/bands
树级具有写入权限,我仍然获得了模拟器写入成功

有没有什么聪明的方法可以让任何人“推”到
/bands
,但当它进入实际的
/bands/$bandId
级别时,它开始考虑这些不同的条件?还是我必须修改我的数据,把树分割成更多的树?我还有其他的例子需要这样做,但这是我正在使用的最简洁的版本,我需要解决

有什么想法吗?提前感谢:)


“.write”:“!data.exists()&&auth!=null”
只允许经过身份验证的用户在
频带内的路径不存在的情况下写入路径(创建新内容)。

实际上,我注意到,如果我尝试对
/bands
执行.push()操作,我会遇到一个错误。有没有一种方法可以解释在
/bands
上创建新记录和更新现有记录?我在模拟器中这样做,它只是说“模拟器写入被拒绝”。我第一次注意到它是在我的开发者控制台上,它只是说“权限被拒绝”之类的thing@StevieStar尝试此操作时,您是否已作为经过身份验证的用户登录?如果不需要身份验证来添加新的波段,我会在查看数据库->规则时,将Firebase控制台/仪表板中的
波段内的
更改为
。写入“!data.exists()”,
”,右上角有一个模拟器按钮,让您可以看到作为已验证或未验证用户尝试读取或写入指定位置的结果。我假设当你在之前的评论“Simulator write denied”中写道时,你指的是Android/iOS模拟器,而不是我指的那个。嘿@PatNeedham,当我指的是模拟器时,我指的是Firebase控制台模拟器。不幸的是,我确实需要用户身份验证来创建乐队。奇怪的是,如果乐队已经存在并且需要更新,那么您最初的回答非常有效,但是如果有人试图创建一个新乐队,那么权限会被拒绝:/
{
  "rules": {
    "bands": {
      ".read": "auth != null",
      ".write": "!data.exists() && auth != null",
      "$bandId": {
        ".write": "data.child('creator_id').val() === auth.uid"
      }
    }
  }
}