Правила базы данных Firebase hasChildren - PullRequest
0 голосов
/ 10 июля 2020

Я писал правила безопасности в своей базе данных, но я не понимаю, почему проверка не проходит .. Я просто хочу, чтобы люди могли вводить «Extra», если в ключе написано «nombre». Если это не ключ "nombre", не позволяйте.

правила:

  "rules": {
    "Users": {
      "$uid": {
          ".read": "$uid === auth.uid",
          ".write": "$uid === auth.uid && root.child('Users').child(auth.uid).exists() === false || newData.hasChild('Extra')",
          ".validate": "newData.hasChildren(['nombre'])",
             "Extra":{ 
             
               }
             }
           }
         }

Правило записи неправильное? Кто-нибудь объяснит мне, почему?

TEST1 неправильно

ТЕСТ2

1 Ответ

0 голосов
/ 10 июля 2020

Вы пишете в адрес /Users/$uid/Extra, поэтому свойство nombre заканчивается на /Users/$uid/Extra/nombre. Чтобы проверить правило, вам нужно написать на /Users/$uid.

Если вместо этого вы хотите разрешить JSON следующим образом:

Users: {
  myUserId: {
    Extra: {
      nombre: "MT Designer"
    }
  }
}

Тогда ваши правила в настоящее время не работают, потому что вы подтверждаете, что nombre существует под myUserId. Это должно быть:

{
  "rules": {
    "Users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid && root.child('Users').child(auth.uid).exists() === false || newData.hasChild('Extra')",
        "Extra":{ 
          ".validate": "newData.hasChildren(['nombre'])",             
        }
      }
    }
  }
}

Обновление: 2020-07-10

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

"Extra":{ 
  "nombre": {
    ".validate": "data.isString()"
  },
  "$other": {
    ".validate": false
  },
}

Таким образом, это подтверждает, что имя является строкой, и отклоняет все остальные дочерние узлы.

Из комментариев, видимо, вот что получилось у OP:

"Users": {
    "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid && root.child('Users').child(auth.uid).exists() === false || newData.hasChild('Extra')",
        "$othernode": {
            ".validate": false
        },
        "Extra": {
            "nombre": {
                ".validate": "newData.isString()"
            },
            "$other": {
                ".validate": false
            },
        }
    }
},
...