首页 > 解决方案 > 无法读取 firebase 孩子

问题描述

用户登录时可以数据。但我希望每个人都可以对这个孩子。无论登录。

孩子是“gunluksifreler”

这是我的规则

{
  "rules": {
    "Homeland": {
       ".indexOn": ["username","email","bakiyetl","yarismada","yarismadabb","splashmesaj","uygulama1tut","uygulama2tut","uygulama3tut","uygulama4tut","uygulama5tut","uygulama6tut","uygulama7tut","uygulama8tut","uygulama9tut","uygulama10tut"]
        },
   "Odultalepleri": {
       ".indexOn": ["username","odul1"]
        },
    "Yardim": {
       ".indexOn": ["id"]
        },      
    "gunluksifreler": {
      ".read": true, // <-- allows every person
      ".write": true
    },
      "Devices": {
      ".read": true, // <-- allows every person
      ".write": true
    },
      ".read": "auth !== null", // <-- allows read if logged in
      ".write": "auth !== null" // <-- allows write if logged in
  }
}

当我设置真正的最后阅读行时,每个人都可以阅读

".read": true, // <-- allows read everbody
".write": "auth !== null" // <-- allows write if logged in

但这一次每个人都可以阅读每个孩子。我错过了什么?

代码

var kullanici = firebase.database().ref();
kullanici.on('value' ,function(datasnapshot) {
     if(datasnapshot.hasChild("gunluksifreler")){
         alert("yes");
     }});

但这与代码无关,而与规则有关。

标签: firebasefirebase-realtime-database

解决方案


如果您不希望匿名用户能够读取整个数据库,则不应"read": true安全规则的根级别允许。

然后,如果您想允许所有人阅读kullanici,则应"read": true在规则中允许该节点。

因此,您原始规则的这一部分对我来说看起来不错:

{
  "rules": {
    "gunluksifreler": {
      ".read": true
    },
    ".read": "auth !== null"
  }
}

我强烈建议将来在您的问题中同样关注规则/代码,因为它可以确保我们都在查看相同的最小但完整的片段。

问题不在于规则,而在于您的代码:

var kullanici = firebase.database().ref();
kullanici.on('value', ...

这是试图读取规则明确不允许的数据库的根目录。所以这个读被拒绝了。

记住这一点的一个好方法是Firebase 安全规则不会自行过滤任何数据。他们只是检查您尝试执行的读取是否允许。所以上面的读取尝试读取根目录,这是不允许的。Firebase 不会检查根的每个子节点以仅返回允许的子数据,因为其性能很难保证。

如果要读取kullanici节点,则应将侦听器附加到该节点:

var kullanici = firebase.database().ref("kullanici");
kullanici.on('value', ...

推荐阅读