【问题标题】:Difficulty setting up validation rules for Firebase datastructure难以为 Firebase 数据结构设置验证规则
【发布时间】:2016-05-15 10:17:46
【问题描述】:

我正在为使用 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. 只有活动的所有者才能将其活动的密钥添加/删除到共享活动列表中。

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

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

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

为了澄清这个例子的需求: 只有拥有邮件“ZW5kc3dhc0BldmVyeW1hMWwuYml6”的用户才能阅读三个嵌套的孩子。 只有事件 '-BDKBEvy-hssDhKqVF5w' 的所有者才能创建/删除此值。 (其他事件键/布尔值对相同)。

我的问题:此设置是否可行(以及如何设置创建/删除规则)?或者这不起作用,我应该重新考虑/构建数据吗?

感谢任何帮助!

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

上面的问题已经回答了,这部分显示的是生成的json

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

再次感谢您的快速支持!

【问题讨论】:

  • 嘿彼得,我还不清楚你的数据结构。我认为您有一个实际事件数据所在的顶级节点。如果是这样,您也可以添加该 JSON 的 sn-p 吗?
  • 我也认为你会有一些从auth.uid 映射到你称之为“邮件”的值的节点。请也添加。

标签: firebase firebase-security firebase-realtime-database


【解决方案1】:

您需要一个嵌套的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) }

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

【讨论】:

  • 弗兰克,这太棒了!你帮我解决了一个我一直在努力解决的问题 :) 我不知道创建这些“双”路径定义的可能性。谢谢。然而,生成的 rules.json 文件确实包含一个小问题:为两个路径生成了一个布尔值 .validation 语句。我已经用 json 输出编辑了我的问题,因为它不适合评论。
  • 我在解决问题的过程中学到了很多关于 Bolt 的知识,所以很有趣!博尔特厉害。我知道,但有时需要提醒。哦,将您的 JSON 添加到问题中是正确的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 2018-03-30
  • 2020-09-24
  • 2016-03-12
  • 2011-04-06
  • 1970-01-01
相关资源
最近更新 更多