【问题标题】: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 说的路上,所以我遇到了这个问题。我会试试你的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2023-02-21
  • 2017-10-27
相关资源
最近更新 更多