Правила Firebase: Как искать значение во всех дочерних элементах узла?

#android #firebase #firebase-realtime-database #firebase-security

#Android #firebase #firebase-realtime-database #firebase-безопасность

Вопрос:

Я пытаюсь создать администраторов для приложения, вручную введя их в Firebase на основе сгенерированного uid для входа в Twitter. Мне интересно, как я могу выполнить поиск во всех дочерних элементах под узлом для определенного uid, чтобы указать r / w доступ.

У меня есть следующее

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

Я хочу предоставить r / w доступ к ленте в зависимости от того, существует ли uid в ADMINS. Эти правила работают:

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

Но если у меня переменное количество администраторов, как мне выполнить поиск по всем «uid»? Я попытался ввести дочернее имя в качестве uid, а затем выполнить поиск, чтобы узнать, существует ли оно, но чтение не сработало:

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

Ответ №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()"
 

Комментарии:

1. Просто хотел отметить, что при использовании запроса с этим решением следует использовать orderByKey() вместо orderByChild(). Спасибо!