Firebase数据库规则意外行为

时间:2018-05-26 21:32:25

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

我按照文档设置规则。这是一个简单的聊天应用程序,我想只检索最近的消息(即在最后X分钟创建的消息)。我发现了以下document并尝试了完全相同的事情。

结构

enter image description here

规则

{
  "rules": {
    "messages": {
      "$message": {
        ".read": "data.child('timestamp').val() > 1" // try allowing everything
      }
    },
    ".write": true
  }
}

看起来没有检索到任何消息。作为解决方法,我在客户端这样做:

messagesRef.orderByChild('timestamp')
  .startAt(Date.now() - 600000)
  .on('child_added', (data) => {
    // do something
  })

希望有人可以帮我解决规则!

1 个答案:

答案 0 :(得分:0)

您引用的文档可保护每条消息的节点。因此/messages/-LDR_...ADvS如果不太旧就可以访问。

但您的查询是从/messages开始阅读的,您尚未授权任何人。

这是Firebase安全规则中最常见的陷阱之一的示例:规则不是过滤器。有关详情,建议您查看Firebase文档中的rules are not filters部分,此first question explaining it或此后的许多questions mentioning "rules are not filters部分。

但事情今年早些时候发生了变化。虽然安全规则仍然不能用于过滤数据,但它们可用于验证查询。例如,请参阅documentation on query based rules

中的此示例
"baskets": {
  ".read": "auth.uid != null &&
            query.orderByChild == 'owner' &&
            query.equalTo == auth.uid" // restrict basket access to owner of basket
}

允许/basketsowner == uid查询。所以现在我们授予用户/baskets的访问权限,但前提是它们符合我们服务器端安全规则指定的条件。

不幸的是,我上次检查时,当前timestamp在查询中不可用,因此无法编写仅允许您的变通方法查询的规则。