使用Firebase规则后,仍可以阅读过去10分钟内的消息

时间:2017-04-19 12:22:57

标签: json firebase time firebase-realtime-database

我的Firebase实时数据库中有以下规则:

{
  "rules": {
    "messages":{
      "$key":{
        // only messages from the last 10 minutes can be read
        ".read": "data.child('time').val() > (now - 600000)",
      }
    },
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

以下数据结构:

enter image description here

不幸的是,仍然可以读取存在时间超过10分钟的消息。我的代码出了什么问题?

摘要:要读取密钥的子项,必须对用户进行身份验证,并且“时间”必须小于10分钟(600000毫秒)。

我担心我没时间完成工作了!我愿意把我的恩惠奖励给解决我问题的人。

2 个答案:

答案 0 :(得分:2)

它不起作用的原因是因为你在读取后使用了读取,所以它取代了上面的读取

{
  "rules": {
    "messages":{
      "$key":{
        ".read": "auth != null && data.child('time').val() > (now - 600000)",
      }
    },
    ".write": "auth != null"
  }
}

这样可以正常使用

答案 1 :(得分:0)

这与Firebase规则级联的方式有关,如in the documentation所述:

  

请注意,数据库中的.read和.write规则覆盖较深的规则

This blog post进一步强调关于规则级联的一节中的要点,注意:

  

Firebase规则以这样的方式级联:向父节点授予读取或写入权限总是授予对所有子节点的读/写访问权。

因此,在这种情况下,您的规则允许访问auth != null位于数据库根目录的位置,从而为已登录(或匿名授权)用户的任何人提供读写访问权限,即使您的更深入的其他.read规则似乎禁止这样做。根级别的规则具有优先级,因此基于时间的其他规则无关紧要!

您需要做的是删除位于根级别的.read规则,这将允许您的邮件读取规则生效;然后,如果您的数据库中有单独的部分,请根据需要为它们提供自己的规则。

因此,如果您有“消息”和“用户”的单独部分,那么您的规则可能如下所示:

{
  "rules": {
    "messages":{
      "$key":{
        ".read": "data.child('time').val() > (now - 600000) && auth != null",
      }
    },
    "users":{
      ".read": "auth != null",
    },
  ".write": "auth != null",
  }
}

“messages”.read规则要求用户获得授权并且在指定的时间限制内。 “用户”节点下的数据.read规则只需要授权用户,“.write规则位于根级别,因此适用于任何授权用户可以写入的所有内容。