【发布时间】:2018-03-14 09:03:49
【问题描述】:
我有以下数据库架构:
{
"events": {
"$eventId": {
"eventTitle": "Go shopping",
"participants": {
"0": {
"id": "0",
"name": "John Smith"
},
"1": {
"id": "1",
"name": "Jason Black"
}
}
}
}
}
这是一个事件数组,其中每个事件都有一个参与者列表。如何制定数据库规则,其中:
- 每个人都可以获取事件或事件列表,
- 获取活动时,参与者的完整列表只能由管理员查看,
- 在获取事件时,如果用户是该事件的参与者,参与者列表将只检索他,而不是其他人,
- 获取事件时,如果用户不是参与者,参与者列表将为空
这是我在规则方案中的尝试:
{
"rules": {
"events": {
".read": true,
"$eventKey": {
"eventTitle": {
".validate": "newData.isString() && newData.val().length < 100"
},
"participants": {
".read": "root.child('users/'+auth.uid+'/role').val() === 'ADMIN'",
".validate": "newData.hasChildren()",
"$participantKey": {
".read": "($participantKey === auth.uid || root.child('users/'+auth.uid+'/role').val() === 'ADMIN')",
"id": {
".validate": "newData.val() === $participantKey"
},
"name": {
".validate": "newData.isString() && newData.val().length < 100"
}
}
}
}
}
}
}
它不起作用,因为当我阅读事件列表时,它不遵守 participants 和 $participantKey 字段中的 .read 约束。它只是一直检索完整的参与者列表。
@编辑
换句话说。我有这个简化的规则:
{
"events": {
".read": true,
"$eventKey": {
"participants": {
".read": false
}
}
}
}
当我查询:events/{eventKey}/participants 时,即使 participants 读取标志设置为 false,我仍然会得到一个包含参与者的对象。
但是,当我从events 删除 .read 标志时,然后检索数据尊重participants 中的.read 标志。
@edit2
授予读取位置权限的 .read 规则也将允许读取该位置的任何后代,即使后代有自己的 .read 规则失败。
我现在的问题是,如何省略这条规则?
【问题讨论】:
标签: firebase firebase-realtime-database