Вы пишете в адрес /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
},
}
}
},