【问题标题】:Firebase rule that works like a filter [duplicate]像过滤器一样工作的Firebase规则[重复]
【发布时间】:2016-12-05 20:52:17
【问题描述】:
当在用户节点上使用.read 和真正的规则时,我授予一些经过身份验证的用户的访问权限,读取该树上列出的每个用户。我只需要其中一些。
我需要一些像过滤器一样工作的规则。因此,在获取 User/ 路径时,此经过身份验证的用户将获得一个用户数组,其中包含 only 那些具有类似 $uid > permission > auth.uid = true 的权限路径的用户。
{
"rules": {
"Users" : {
".read": true,
"$uid" : {
".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ $uid+'/permission/'+ auth.uid).val() == true",
".write" : false
}
},
}
}
【问题讨论】:
标签:
firebase
firebase-realtime-database
firebase-security
【解决方案1】:
您不能将规则用作过滤器,它们对于您尝试读/写的特定分支是原子的。
您的外部读取规则允许访问整个 /Users 分支。删除它并拥有您想要阅读的用户 ID,您将获得您期望的行为。因此,不幸的是,这仅在使用 ref.child("Users").child(targetUserId).once... 阅读时才有效。
{
"rules": {
"Users" : {
"$uid" : {
".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ $uid+'/permission/'+ auth.uid).val() == true",
".write" : false
}
}
}
}
如果您想在一次调用中获得经过身份验证的用户有权访问的用户 ID 列表,我建议您将可访问的用户实际保存在 /User/userId 中,而不是拥有可以读取的用户。而且你的规则会稍微改变。
{
"rules": {
"Users" : {
"$uid" : {
".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ auth.uid +'/accessibleUsers/'+ $uid).val() == true",
".write" : false
}
}
}
}
此外,扩展时这可能会变得复杂,因此,根据您为应用程序计划的内容,您应该考虑将这个可访问的用户列表放在一个单独的分支中(在用户之外)。
【讨论】:
-
我明白了。我在article 说的路上,所以我遇到了这个问题。我会试试你的方法。