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

时间:2016-02-24 21:38:44

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

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

我目前正在接受下面的Bolt声明:

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

有了这个,我正试图实现这个目标:

  1. 只有拥有与“共享”键对应的邮件的用户才能阅读数据(他们使用此日期来检索与他们共享的事件的密钥。
  2. 只有活动的所有者才能将其活动的密钥添加/删除到共享活动列表中。
  3. 第二点是我遇到麻烦的地方 - 我无法创建创建/删除规则 - 因为我不知道如何在验证规则中引用布尔值的键... < / p>

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

    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>"
            }
          }
        },
    

    再次感谢您的快速支持!

1 个答案:

答案 0 :(得分: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) }

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