Правила Firebase, показывающие ошибку разрешения при установке значения true

#android #firebase #firebase-realtime-database #firebase-security

#Android #firebase #firebase-база данных в реальном времени #firebase-безопасность

Вопрос:

У меня есть простая структура базы данных, к которой я хочу добавить правила безопасности firebase, но правила блокируют все разрешения, даже когда я устанавливаю значение .read и .write в true в структуре узла, вот пример правила

 {
  "rules": {
    "Lines": {
      ".read": true,
        ".write": false
    },
      "Links": {
      ".read": true,
        ".write": false
    }
  }
}
  

Вот пример моей структуры базы данных

 {
  "Lines" : {
    "Line 1" : "Lines 1238443",
    "Line 2" : "Lines 4657673"
  },
  "Links" : {
    "Links 1" : "Link 3282873",
    "Links 2" : "Link 3493934"
  }
}
  

Я пытаюсь разрешить только операции чтения, но мое приложение продолжает говорить, что в разрешении отказано, я проверил документацию, она выглядит прямолинейно, но я не могу сказать, что именно происходит, потому что даже когда я пытался

 {
  "rules": {
    "Lines": {
      ".read": true,
        ".write": true
    },
      "Links": {
      ".read": true,
        ".write": true
    }
  }
}
  

Я все еще получаю ошибку отказа в разрешении
Вот код для чтения из базы данных

 DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
        databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String lin = snapshot.child("Links").child("Links 1").getValue(String.class);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                
                Toast.makeText(getApplicationContext(), "Error " error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
  

Комментарии:

1. Можете ли вы показать код, используемый для чтения данных?

2. Я обновил вопрос, пожалуйста, перепроверьте

Ответ №1:

Вы пытаетесь выполнить чтение из корня базы данных. И поскольку ваши правила не предоставляют никому доступ на чтение к корню базы данных, чтение отклоняется.

Если вы хотите только прочитать Links дочерний элемент из базы данных, вы должны указать это дочернее имя перед подключением прослушивателя, поэтому:

 DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();

databaseReference.child("Links").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        String lin = snapshot.child("Links 1").getValue(String.class);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {        
        Toast.makeText(getApplicationContext(), "Error " error.getMessage(), Toast.LENGTH_SHORT).show();
    }
})
  

Теперь мы подключаем прослушиватель к /Links , где правила безопасности позволяют считывать данные.