【问题标题】:Firebase Database not loading data offlineFirebase 数据库未离线加载数据
【发布时间】:2017-03-14 12:23:06
【问题描述】:

我有一个在离线模式下使用 Firebase 数据库的应用(通过调用 FirebaseDatabase.getInstance().setPersistenceEnabled(true))。数据库中有一个节点,只有当其他节点的值设置为true时,用户才能访问,规则如下所示:

{
  "rules": {
    ".write": "auth != null",
    ".read": "false",
    "mynode": {
      "$dataId": {
        ".read": "auth != null && root.child('userAccessNode/' + auth.uid + '/' + $dataId).val() == true"
      }
    }
  }
}

当设备连接到互联网时它可以正常工作。但是,当我在设备上打开飞行模式时,回调 addValueEventListener(ValueEventListener) 不会返回任何内容 - 也不是错误,不是值,只是挂起,直到我再次打开互联网连接。

我确保在离线之前检索了两个节点,因此我确定有问题的节点和持有访问信息的节点已被缓存。

对于其他具有简单规则的节点,例如 (auth != null) 离线模式可以正常工作,但在这种情况下则不行。

我做错了吗?知道如何使这项工作吗?离线时规则(依赖于其他节点)评估如何工作?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    Firebase 实时数据库安全规则始终在服务器端进行评估。这可以防止恶意客户端绕过这些规则。

    【讨论】:

    • 这是否意味着“安全”节点无法离线访问,即使它们在进入飞行模式前几秒钟就可以访问?这似乎至少有点奇怪和不一致。我希望用户能够离线访问设备上次在线时可用的所有内容。
    • 这也没有解释为什么从两个节点(一个具有上述复杂规则,一个仅检查用户登录),我只能获取其中一个节点的离线数据,而不是其他?
    • 如果您处于离线状态,Firebase 也无法检查当前身份验证令牌是否有效。令牌在一小时后过期,设备必须在线才能刷新。请记住,Firebase 不适合离线使用。它恰好支持某些离线用例的一些优化。
    • 这似乎没有回答这个问题。我知道规则是在服务器端评估的。但是为什么客户端不让已经同步的数据离线,只是有复杂的安全规则呢?
    猜你喜欢
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2018-06-23
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多