基于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
答案 0 :(得分:1)
Firebase的security rules don't filter your data。它们仅验证允许读取操作。因此,如果将侦听器附加到根,它将检查您是否具有对根的读取权限。由于您那里没有读取权限,因此整个读取操作将被拒绝。
如果您还告诉仿真器读取根(/
),则仿真器将给出相同的结果。
答案 1 :(得分:1)
当.read和.write规则权限评估为 true 时,这将级联到该规则的所有子级。
但虚假并没有级联
当.read和.write规则权限评估为 false 时,这将不级联到该规则的所有子级。