Невозможно прочитать данные с узла, даже если для правила безопасности firebase установлено значение true - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть база данных firebase с узлом тем, которые содержат различные темы.Когда я пытаюсь применить правило чтения на этом узле, я могу прочитать значение в имитаторе правил безопасности Firebase, но не в моем реальном приложении.Но если я применю правило к самому родительскому узлу, я смогу извлечь значение.

Вот моя база данных: enter image description here

Ниже приведена моя база безопасности firebaserule:

  {
  "rules": {
    "users":{
      "$user_id":{
        ".read": "auth != null && !root.child('blocked/'+$user_id+'/'+auth.uid).exists()",
        ".write": "$user_id === auth.uid"
      }
    },
    "topics":{
      //".read": "true",
      "$topic_id":{
        //restricting blocked users from reading the topcis
        ".read": "true",
        ".write": "auth != null"
      },
    }
  }
}

Теперь, если я раскомментирую это ".read" правило на родительском узле, я смогу прочитать, но не когда применю его с подстановочным знаком.Я также могу отлично писать в узел темы.

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

public void loadTopics() {
        //Load topics for the first time
        createTopicFab.show();
        Query topicQuery = FirebaseDatabase.getInstance().getReference()
                .child(FirebaseValues.TOPICS_TABLE).limitToLast(TOTAL_ITEM_EACH_LOAD).orderByChild("createdTimestamp");
        itemPos = 0;
        topics.clear();
        topicIds.clear();
        topicQuery.addChildEventListener(new ChildEventListener() {


            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                // Add the values in the topics list and notify the adapter
                loadingLayout.setVisibility(View.GONE);
                Topics topic = dataSnapshot.getValue(Topics.class);
                Log.d(TAG, "loadTopics(), Topic: " + topic.getText());
                topics.add(0, topic);
                if (itemPos++ == 0) {
                    //first key
                    lastKey = String.valueOf(dataSnapshot.getKey());
                }
                topicIds.add(0, dataSnapshot.getKey());
                topicsListAdapter.notifyDataSetChanged();
                swipeRefTopic.setRefreshing(false);
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
                // remove the values in the topics list and notify the adapter
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

1 Ответ

0 голосов
/ 26 ноября 2018

Это ваш базовый запрос:

Query topicQuery = FirebaseDatabase.getInstance().getReference()
    .child(FirebaseValues.TOPICS_TABLE)

Я предполагаю, что FirebaseValues.TOPIC_TABLE - это "топики".Этот запрос не может прочитать дочерние элементы в / themes, потому что вы не предоставили доступ для чтения в этом месте.Когда вы даете доступ к / темам, это будет работать, как вы заметили.Все, что имеет значение, - это местоположение запроса - разрешение детей в данном случае не имеет значения.Правила безопасности не будут «фильтровать» детей под локацией для вас.Прочитайте документацию о " правила безопасности не являются фильтрами ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...