【问题标题】:Firebase Rules: How to search all children of a node for a value?Firebase 规则:如何在节点的所有子节点中搜索值?
【发布时间】:2021-05-05 18:24:31
【问题描述】:

我正在尝试通过根据 Twitter 登录生成的 uid 在 Firebase 中手动输入应用来为应用创建管理员。我想知道如何在一个节点下的所有子节点中搜索特定的 uid 以指定 r/w 访问权限。

我有以下

{
  "GRP1" : {
    "ORG1" : {
      "CONF1" : {
        "TEAM1" : {
          "ADMINS" : {
            "Name1" : {
              "uid" : "abcd1239"
            },
            "Name2" : {
              "uid" : "abcf1234"
            }
          },
          "FEED" : {
            "Store1" : {
              "info1" : "some text"
            },
            "Store2" : {
              "info2" : "some other text"
            }
          }
        }
      }
    }
  }
}

我想根据 uid 是否存在于 ADMINS 中提供对 FEED 的读/写访问。此规则有效:

".read" : "root.child('GRP1').child('ORG1').child('CONF1').child('TEAM1').child('ADMINS').child('Name1').child('uid').val() === auth.uid"

但如果我有可变数量的 ADMINS,我如何搜索所有的“uid”?我尝试输入子名称作为 uid,然后搜索它是否存在,但读取不起作用:

".read" : "root.child('GRP1').child('ORG1').child('CONF1').child('TEAM1').child('ADMINS').child(auth.uid).exists()"

【问题讨论】:

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


    【解决方案1】:

    您不能在安全规则中跨节点搜索,因为这不会扩展。这意味着如果要检查 UID 是否存在于 JSON 中的某个位置,则必须将该 UID 作为节点的键。

    所以你的 JSON 将是:

    {
      "GRP1" : {
        "ORG1" : {
          "CONF1" : {
            "TEAM1" : {
              "ADMINUIDS" : {
                "abcd1239": "Name1",
                "abcf1234": "Name2"
              }
    

    现在您可以使用以下命令检查 UID 是否存在:

    ".read" : "root.child('GRP1/ORG1/CONF1/TEAM1/ADMINUIDS').child(auth.uid).exists()"
    

    【讨论】:

    • 只是想注意在此解决方案中使用 Query 时使用 orderByKey() 而不是 orderByChild()。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多