Firebase规则允许读取但不允许写入

时间:2017-12-29 12:21:45

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

"display": {
      ".read": "auth != null",
      ".write": "auth != null",
        "abc": {
          ".indexOn": ["hhh"],
          "$display_id": {
            "aaa": {".validate": "newData.isString() && newData.val().length > 0"},
            "bbb": {".validate": "newData.isString() && newData.val().length > 0"},
            "ccc": {".validate": "newData.isString() && newData.val().length > 0"},
            "ddd": {".validate": "newData.isString() && newData.val().length > 0"},
            "eee": {".validate": "newData.isString() && newData.val().length > 0"},
            "fff": {".validate": "newData.isString() && newData.val().length > 0"},
            "ggg": {".validate": "newData.isString() && newData.val().length > 0"},
            "hhh": {".validate": "newData.isString() && newData.val().length > 0"},
            "iii": {".validate": "newData.isString() && newData.val().length > 0"},
            "jjj": {".validate": "newData.isString() && newData.val().length > 0"},
            "kkk": {".validate": "newData.val() == $display_id"},
            "lll": {".validate": "newData.isNumber()"},
            "$others": {".validate": false}
            }
        }
}

以上代码是Firebase数据库规则部分中我的一个路径规则的摘录。

仅供参考,display_id是推送值,lll是从calendar.getTimeInMillis()获得的长。

我一直试图找到解决方案很长一段时间,我即将放弃。

这是我迄今为止的一些观察。

  1. 规则树中“display”上方没有.read.write,因此在读取或写入数据时不应出现任何级联错误。
  2. 我的应用程序的java类模型应该没有任何问题,因为我可以正确读取数据
  3. 不应该有任何身份验证错误,因为我可以使用auth != null
  4. 读取数据
  5. 不应该有任何注释错误,因为规则applet目前没有给我任何错误
  6. 我迷路了。当我通过我的应用程序将数据写入此节点时,我不断获得权限拒绝。

    有什么想法吗?

1 个答案:

答案 0 :(得分:0)

对于最新的更新感到抱歉!我设法解决了这个问题。如果我没有发布所需的代码块,请道歉。

遗憾的是,这个问题是一个层叠问题,我一定是出于某种原因误解了它。

如果我要在特定节点上放置读写规则,我必须至少从该特定节点引用,并且我希望文档更清晰但是在意识到这个错误之后一切都运行得很好!

例如,如果我有一个类似这样的数据库结构:

"display": {
  ".read": "auth != null",
  ".write": "auth != null",
    "abc": {
      ".indexOn": ["hhh"],
      "$display_id": {
        "aaa": {".validate": "newData.isString() && newData.val().length > 0"},
        "bbb": {".validate": "newData.isString() && newData.val().length > 0"},
        "ccc": {".validate": "newData.isString() && newData.val().length > 0"},
        "ddd": {".validate": "newData.isString() && newData.val().length > 0"},
        "eee": {".validate": "newData.isString() && newData.val().length > 0"},
        "fff": {".validate": "newData.isString() && newData.val().length > 0"},
        "ggg": {".validate": "newData.isString() && newData.val().length > 0"},
        "hhh": {".validate": "newData.isString() && newData.val().length > 0"},
        "iii": {".validate": "newData.isString() && newData.val().length > 0"},
        "jjj": {".validate": "newData.isString() && newData.val().length > 0"},
        "kkk": {".validate": "newData.val() == $display_id"},
        "lll": {".validate": "newData.isNumber()"},
        "$others": {".validate": false}
        }
    }
}

在我的代码中,我应该在尝试对该节点执行查询之前立即编写此代码(在onCreate()中编写此代码会有所帮助):

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("display") //reference immediately to the "display" node, where you intend to put the read and write rules;

希望这会有所帮助,并对Firebase规则文档的巨大误解表示道歉。

相关问题