Безопасность Firebase требует нескольких запросов, чтобы получить детей - PullRequest
0 голосов
/ 13 июля 2020

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

  "Settings":{ 
    ".read": "auth != null",
    ".write": "root.child('Users').child(auth.uid).child('rank').val() == 3",
    "$id":{
      ".read": "$id == 'maintenance' || $id == 'welcomeList'"
    }
},

Но таким образом я не могу получить настройки, используя один запрос, как показано ниже:

settingsRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        settings = dataSnapshot.getValue(Settings.class));
    }
});

Мне нужно дважды запросить, чтобы получить то, что я хочу. Есть ли другой способ сделать это? Потому что в будущем мне понадобится больше двух детей, и я не хочу, чтобы у меня было 5 разных запросов.

settingsRef.child("maintenance").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        settings.setMaintenance(dataSnapshot.getValue(Integer.class));
    }
});

settingsRef.child("welcomeList").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {              
         settings.setWelcomeList(dataSnapshot.getValue());
    }
});

1 Ответ

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

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

Обычное решение - разделить параметры publi c и «немного меньше» publi c на два верхнего уровня. узлы:

"Settings":{ 
    ".read": "auth != null",
    ".write": "root.child('Users').child(auth.uid).child('rank').val() == 3",
},
"PublicSettings":{ 
    ".read": true,
    ".write": "root.child('Users').child(auth.uid).child('rank').val() == 3",
},

Теперь все пользователи должны будут выполнить два чтения, одно для параметров, требующих аутентификации, и одно для параметров publi c. Но теперь для этого потребуется два чтения, независимо от того, сколько свойств publi c вы определите.

...