Firebase安全规则 - 模拟器和代码之间的行为差​​异

时间:2018-02-28 07:42:19

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

数据

"directChat" : {
  "creator" : {
    "1-L6HQZZSvJ0aarUmXdtN" : {
      "ID" : "XXX",
      "fbID" : "YYY",
      "name" : "Hari"
    }
  },
  "target" : {
    "1-L6HQZZSvJ0aarUmXdtN" : {
      "ID" : "ZZZ",
      "fbID" : "AAA",
      "name" : "John Doe"
    }
  }
}

安全规则

"directChat": {
  "creator": {
    "$cID": {
      ".write": "data.val() == null && auth != null && newData.parent().parent().parent().child('directChat/creator/' + $cID + '/ID').val() == auth.uid",
      ".read": "auth != null && data.child('revealed').val() == true && root.child('directChat/target/' + $cID + '/ID').val() == auth.uid"
    },
    ".read": "auth != null && auth.uid == query.equalTo && query.orderByChild == 'ID'"
  }
}

Firebase模拟器

Simulation type - Read
Ref - /directChat/creator/1-L6HQZZSvJ0aarUmXdtN/
UID - XXX

代码

async runTests(){
  var creatorIsMe = await firebase.database().ref('directChat/creator/1-L6HQZZSvJ0aarUmXdtN/').once('value')
  console.warn('value1', creatorIsMe)
}

模拟失败,这是预期的行为,但我的代码返回快照!我错过了什么?

1 个答案:

答案 0 :(得分:1)

在浪费了大约半天后发现它。它是由于离线持久性。

我开始使用auth!= null这样的规则,然后同步到脱机缓存。当我更改规则以向数据添加更多限制时,数据不会同步,并且会使结果从离线状态返回。

这是糟糕的火基! Firebase脱机持久性应该将Permission denied错误视为由于脱机/其他原因无法访问服务器数据。

最好不要在开发模式下启用离线持久性。