基于Firebase查询的安全规则在模拟器上不起作用

时间:2018-06-26 11:50:34

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

我正在尝试在Firebase实时数据库->规则->模拟器上测试简单的代码,但无法读取。我只是在尝试docs

中的简单代码
"JetonAlanlar" : {      
              ".write": "auth != null && !root.child('Banned').hasChild(auth.uid)",                 
              "Sorular":{
                "Tarih":{

                  ".read": "query.orderByKey && query.limitToFirst <=30"

                },
              }
          },

这是模拟器运行代码:

/JetonAlanlar/Sorular/Tarih

模拟器表示读取权限被拒绝。是模拟器上的这个问题,还是Firebase Realtime数据库不支持基于查询的规则。

编辑:

这是我在Android应用程序中查询的代码

public class SorularFragmentYeni extends SoruAdaptor {


    public SorularFragmentYeni() {}

    @Override
    public Query getQuery(DatabaseReference databaseReference) {

    ... 

        return databaseReference.child("JetonAlanlar/Sorular").child("Tarih");
    }
}

public abstract class SoruAdaptor extends Fragment implements RewardedVideoAdListener {

...

public abstract Query getQuery(DatabaseReference databaseReference);

}

1 个答案:

答案 0 :(得分:1)

正如André所说:Firebase数据库的规则模拟器不允许您模拟查询。它仅模拟对某个位置的读取或对该位置的写入。这就解释了为什么您的读取不起作用的原因:您的规则仅允许查询,而模拟器不使用查询。

您的代码也不会返回查询:

databaseReference.child("JetonAlanlar/Sorular").child("Tarih")

此代码仅是从您的安全规则不允许的位置读取的内容。如果要允许此读取操作,则规则应为:

"JetonAlanlar" : {      
  "Sorular":{
    "Tarih":{
      ".read": true
    }
  }
}

如果要保留当前规则,则需要确保代码与查询允许的内容匹配:

public Query getQuery(DatabaseReference databaseReference) {

    ... 

    return databaseReference.child("JetonAlanlar/Sorular").child("Tarih")
                            .orderByKey().limitToFirst(30);
}

认为安全规则将为您添加最后两个子句是一个常见错误。但是,这不是Firebase的安全规则的工作方式:Firebase只是根据规则检查是否允许查询。