如何在规则表达式中引用数据库的 NEW 根?
How to reference the NEW root of the database in the rule expression?
为了说明我的用例,请考虑用户和组之间的双向关系。用户可以属于一个组,组包含一个用户列表。
{
"users": {
"alovelace": {
"name": "Ada Lovelace",
"groupId": "techpioneers",
},
"eclarke": {
"name": "Edmund M. Clarke"
},
// ...
},
"groups": {
"techpioneers": {
"name": "Historical Tech Pioneers",
"members": {
"alovelace": true,
"ghopper": true
}
},
// ...
}
}
要将 eclarke
关联到一个组,客户端应该在一次更新中更新两个路径(/users/eclarke/groupId
和 /groups/techpioneers/members/eclarke
),这样就没有中间无效状态。
为了确保这一点,我为每个路径设置了安全规则以相互引用:
{
"rules": {
"users": {
"$userId": {
"groupId": {
".validate": "newData.parent().parent().parent().child('groups').child(newData.val()).child('members').hasChild($userId)"
}
}
},
"groups": {
"$groupId": {
"members": {
"$memberId": {
".validate": "newData.parent().parent().parent().child('users').child($memberId).child('groupId').val() === $groupId"
}
}
}
}
}
}
我不能在这里使用 root
因为我会查看旧的数据库状态。
有更好的方法吗? (无需多次 .parent()
调用)
不幸的是,没有 newRoot
变量可以解决多个 parent
调用。这个概念 被 添加到 Bolt 安全规则语言中,但由于它从未添加到常规 JSON 语言中,因此 Bolt 也将其编译为所需数量 parent
来电。
所以目前,您所拥有的是执行此操作的正确方法。 file a feature request 是个不错的主意,因为团队看到此请求可能已经有一段时间了。
为了说明我的用例,请考虑用户和组之间的双向关系。用户可以属于一个组,组包含一个用户列表。
{
"users": {
"alovelace": {
"name": "Ada Lovelace",
"groupId": "techpioneers",
},
"eclarke": {
"name": "Edmund M. Clarke"
},
// ...
},
"groups": {
"techpioneers": {
"name": "Historical Tech Pioneers",
"members": {
"alovelace": true,
"ghopper": true
}
},
// ...
}
}
要将 eclarke
关联到一个组,客户端应该在一次更新中更新两个路径(/users/eclarke/groupId
和 /groups/techpioneers/members/eclarke
),这样就没有中间无效状态。
为了确保这一点,我为每个路径设置了安全规则以相互引用:
{
"rules": {
"users": {
"$userId": {
"groupId": {
".validate": "newData.parent().parent().parent().child('groups').child(newData.val()).child('members').hasChild($userId)"
}
}
},
"groups": {
"$groupId": {
"members": {
"$memberId": {
".validate": "newData.parent().parent().parent().child('users').child($memberId).child('groupId').val() === $groupId"
}
}
}
}
}
}
我不能在这里使用 root
因为我会查看旧的数据库状态。
有更好的方法吗? (无需多次 .parent()
调用)
不幸的是,没有 newRoot
变量可以解决多个 parent
调用。这个概念 被 添加到 Bolt 安全规则语言中,但由于它从未添加到常规 JSON 语言中,因此 Bolt 也将其编译为所需数量 parent
来电。
所以目前,您所拥有的是执行此操作的正确方法。 file a feature request 是个不错的主意,因为团队看到此请求可能已经有一段时间了。