Firebase规则就像过滤器一样工作

时间:2016-07-31 19:19:09

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

在“用户”节点上使用具有真实规则的.read时,我可以访问一些经过身份验证的用户,读取该树上列出的每个用户。我当时只需要一些。

我需要一些像过滤器一样的规则。因此,在获取用户/路径时,此经过身份验证的用户将获得的用户数组,这些用户数组具有此$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
      }
    },
  }
}

1 个答案:

答案 0 :(得分:2)

您不能将规则用作过滤器,它们对您尝试读/写的特定分支是原子的。

您的外部读取规则允许访问整个ref.child("Users").child(targetUserId).once...分支。删除它并拥有您想要阅读的userId将获得您期望的行为。所以,不幸的是,只有在使用{ "rules": { "Users" : { "$uid" : { ".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ $uid+'/permission/'+ auth.uid).val() == true", ".write" : false } } } } 进行阅读时才会有效。

/User/userId

如果您希望在一次调用中获得经过身份验证的用户有权访问的用户ID列表,我建议您实际将可访问用户保存在 { "rules": { "Users" : { "$uid" : { ".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ auth.uid +'/accessibleUsers/'+ $uid).val() == true", ".write" : false } } } } 内,而不是拥有可以读取的用户ID。你的规则会略有变化。

{{1}}

此外,缩放时可能会变得复杂,这取决于您为应用程序规划的内容,您应该考虑将此可访问用户列表放在单独的分支中(在用户之外)。