Как заблокировать запись пользователя в базу данных Firebase? Без изменения всех остальных правил, приведенных ниже

# #firebase #firebase-realtime-database #firebase-authentication #firebase-security

Вопрос:

Я управляю списком заблокированных, я хочу, чтобы пользователям в списке заблокированных было запрещено писать/читать базу данных (запрещено). Но если я напишу это на более высоком уровне, все остальные правила, приведенные ниже, не будут работать для пользователей, которые не находятся в списке заблокированных. Есть ли способ по-прежнему писать его на более высоком уровне вместо редактирования всех таблиц ниже?

    {
   "rules": { 
         ".write": "!root.child('blocked').child(auth.uid).exists() ",
         ".read": "!root.child('blocked').child(auth.uid).exists() ",
               "scores": {
                   "$sid": {
                  ".read": true,
                   ".write": "root.child('game').child($sid).child(auth.uid).exists()amp;amp; auth!=null"
                  },
             "games": {
                   "$sid": {
                  ".read": true,
                   ".write": "root.child('location').child($sid).child(auth.uid).exists()amp;amp; auth!=null"
  }
},...
 

Ответ №1:

К сожалению, правила базы данных Firebase RealtimeDatabase работают каскадно:

Как говорят врачи:

правила чтения и записи работают сверху вниз, при этом более мелкие правила переопределяют более глубокие правила . Если правило предоставляет разрешения на чтение или запись по определенному пути, оно также предоставляет доступ ко всем дочерним узлам под ним. Рассмотрим следующую структуру:

Это означает, что если вы разрешите или запретите в родительском узле, это переопределит правила дочернего узла. В вашем случае блокировка сработает, но если кто-то не будет заблокирован, ему будут разрешены все дочерние узлы независимо от того, какие правила вы для них написали.

Вам нужно интегрировать это с || оператором для каждого дочернего узла.