2016-10-21 3 views
1

У меня есть эта структура данных.Правила базы данных Firebase. Как защитить узел от удаления с помощью .set (null) вызова

root 
    -foo 
     -key0 
      -bar1:baz1 
      -bar2:baz2 
     -key1 
      -bar1:baz1 
      -bar2:baz2 

И у меня есть эта структура правил.

"foo":{ 
    ".read":true, 
    ".write":"auth != null", 
    ".validate":"newData.hasChildren(['bar1', 'bar2'])" 
} 

Но когда я попытался сделать это firebase.database().ref('/foo').remove() или это firebase.database().ref('/foo').set(null); на консоли JavaScript, то .validate по правилам не соблюдается, и данные о foo узла удаляется.

Hod делать, я защищаю узлы базы данных, которые не связаны с определенным пользователем?

ответ

2

Чтобы предотвратить /foo от удаления, вы можете проверить, что newData.val() не null:

"foo": { 
    ... 
    ".write": "(auth != null) && (newData.val() != null)", 
    ... 
} 
+0

Так что я не буду использовать '' .validate ''? – CENT1PEDE

+0

Это сработало, но разве это не странно? Или я странный, думая, что этот подход странный? – CENT1PEDE

+0

В любом случае, спасибо! :) – CENT1PEDE

2

Validation шаг полностью пропущен, потому что запись была запрещена.

Примечание: .validate правила оцениваются только для ненулевых значений и не каскад.

Прочтите следующий раздел с большим полезным видео из документации firebase для обеспечения безопасности данных.

https://firebase.google.com/docs/database/security/

Вы должны изменить свои правила.

"foo":{ 
    ".read":true, 
    ".write":"auth != null && newData.exists()", 
    ".validate":"newData.hasChildren(['bar1', 'bar2'])" 
}