难以为 Firebase 数据结构设置验证规则

Difficulty setting up validation rules for Firebase datastructure

我正在为使用 Bolt 编译器创建的 Firebase 数据结构设置验证规则。

我目前有以下 Bolt 声明:

path /sharedEvents/{share} is Boolean[] {
    read() { isMailOfCurrentUser( share ) }
    create() { isOwnerOfEvent( ...) }      //NOT YET CORRECT!
    delete() { isOwnerOfEvent( prior(...) } //NOT YET CORRECT!
}

有了这个,我正在努力实现:

  1. 只有拥有与 'share' 键相对应的邮件的用户才能读取数据(他们使用此日期检索与他们共享的事件的键。
  2. 只有活动的所有者才能add/remove将其活动的密钥添加到共享活动列表中。

第二点是我 运行 遇到麻烦的地方 - 我无法创建 create/delete 规则 - 因为我不知道如何引用布尔值的键在验证规则中...

上述 bolt 语句在 Firebase 中的示例数据:

sharedEvents  
        ZW5kc3dhc0BldmVyeW1hMWwuYml6
             -BDKBEvy-hssDhKqVF5w: true
             -FDKBEvy-hsDsgsdsf5w: true
             -ADBEvy-hfsdsdKqVF5w: true
        aXQnc251bWJlcnNAbWExbDJ1LnVz
             -KBEvy-hsDhH6OKqVF5w: true

澄清这个例子的需求: 只有邮件 'ZW5kc3dhc0BldmVyeW1hMWwuYml6' 的用户才能阅读三个嵌套的子项。 只有事件“-BDKBEvy-hssDhKqVF5w”的所有者才能 create/delete 这个值。 (另一个事件 key/boolean 对也是如此)。

我的问题:此设置是否有效(以及如何设置 create/delete 规则)?还是这行不通,我应该 rethink/structure 数据吗?

感谢任何帮助!

----------------输出 JSON 文件-------------------- ----------------------

上面的问题已经回答,这部分显示结果json

"sharedEvents": {
      "$share": {
        ".read": "<removed for readability>",
        "$event": {
          ".validate": "newData.isBoolean()",
          ".write": "<removed for readability>"
        }
      }
    },

再次感谢您的快速支持!

您需要一个嵌套的 path 语句来处理对事件的限制(/sharedEvents/$mail/$eventid 下的节点)。我用这个 JSON 结构快速制作了原型:

{
  "events": {
    "-ADBEvy-hfsdsdKqVF5w": {
      "name": "Event 1",
      "ownerMail": "aXQnc251bWJlcnNAbWExbDJ1LnVz"
    },
    "-BDKBEvy-hssDhKqVF5w": {
      "name": "Event 2",
      "ownerMail": "aXQnc251bWJlcnNAbWExbDJ1LnVz"
    },
    "-FDKBEvy-hsDsgsdsf5w": {
      "name": "Event 3",
      "ownerMail": "aXQnc251bWJlcnNAbWExbDJ1LnVz"
    },
    "-KBEvy-hsDhH6OKqVF5w": {
      "name": "Event 3",
      "ownerMail": "ZW5kc3dhc0BldmVyeW1hMWwuYml6"
    }
  },
  "sharedEvents": {
    "ZW5kc3dhc0BldmVyeW1hMWwuYml6": {
      "-ADBEvy-hfsdsdKqVF5w": true,
      "-BDKBEvy-hssDhKqVF5w": true,
      "-FDKBEvy-hsDsgsdsf5w": true
    },
    "aXQnc251bWJlcnNAbWExbDJ1LnVz": {
      "-KBEvy-hsDhH6OKqVF5w": true
    }
  },
  "userMails": {
    "peter": "aXQnc251bWJlcnNAbWExbDJ1LnVz",
    "puf": "ZW5kc3dhc0BldmVyeW1hMWwuYml6"
  }
}

并提出了这些规则:

path /sharedEvents/{share} {
    read() { isMailOfCurrentUser(share) }
}

path /sharedEvents/{share}/{event} is Boolean {
    create() { isOwnerOfEvent(event) }
    delete() { isOwnerOfEvent(prior(event)) }
}

isMailOfCurrentUser(share) { true }
getMailOfCurrentUser(uid) { root.ownerMails.uid }
getEventOwnerMail(event) { root.events.event.ownerMail }
isOwnerOfEvent(event) { getMailOfCurrentUser(auth.uid) == getEventOwnerMail(event) }

忽略我这边的任何错误,这应该是您正在寻找的授权结构的基础知识。