难以为 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!
}
有了这个,我正在努力实现:
- 只有拥有与 'share' 键相对应的邮件的用户才能读取数据(他们使用此日期检索与他们共享的事件的键。
- 只有活动的所有者才能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) }
忽略我这边的任何错误,这应该是您正在寻找的授权结构的基础知识。