如何仅检索Firebase数据库中的某些节点

时间:2019-05-12 23:15:49

标签: android firebase firebase-realtime-database firebase-security-rules

基于Firebase规则的安全性不会返回可读的节点

实时数据库由根级别的三个节点productA,productB和 productC 组成,我只希望读取节点A和B,而不能读取C级别。在这些级别上,当我尝试下面的代码时,Firebase仿真器会产生正确的结果

myDatabaseReference = FirebaseDatabase.getInstance().getReference("/"); // does  not work

//myDatabaseReference = FirebaseDatabase.getInstance().getReference("/productA"); // does work
...
myDatabaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                Iterable<DataSnapshot> snapshotIterator = dataSnapshot.getChildren();


                Iterator<DataSnapshot> iterator = snapshotIterator.iterator();

                while ((iterator.hasNext())) {

                    Object node= iterator.next();
                    String NodeKey = ((DataSnapshot) node).getKey();
                    Object NodeValue = ((DataSnapshot) node).getValue();
                    // dosomething
                }


            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                ItemList.add(databaseError.getMessage());
            }
        });
在getReference中指定根节点时应触发

onDataChange

数据就像enter image description here

模拟器恢复enter image description hereenter image description here

2 个答案:

答案 0 :(得分:1)

Firebase的security rules don't filter your data。它们仅验证允许读取操作。因此,如果将侦听器附加到根,它将检查您是否具有对根的读取权限。由于您那里没有读取权限,因此整个读取操作将被拒绝。

如果您还告诉仿真器读取根(/),则仿真器将给出相同的结果。

答案 1 :(得分:1)

当.read和.write规则权限评估为 true 时,这将级联到该规则的所有子级。

但虚假并没有级联

当.read和.write规则权限评估为 false 时,这将级联到该规则的所有子级。

source