Firebase数据库规则意外行为

Firebase数据库规则意外行为,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我正在按照文档设置规则。这是一个简单的聊天应用程序,我只想检索最近的消息(即在最近X分钟内创建的消息)。我找到了以下内容,并尝试了完全相同的方法 结构 规则 似乎没有检索到任何消息。作为解决方法,我在客户端这样做: messagesRef.orderByChild('timestamp') .startAt(Date.now() - 600000) .on('child_added', (data) => { // do something }) 希望有人能帮我制定

我正在按照文档设置规则。这是一个简单的聊天应用程序,我只想检索最近的消息(即在最近X分钟内创建的消息)。我找到了以下内容,并尝试了完全相同的方法

结构

规则

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

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

希望有人能帮我制定规则

您所参考的文档保护每个单独消息的节点。因此,如果
/messages/-LDR\ux…ADvS
不太旧,则可以访问它

但是您的查询是从
/messages
读取的,您没有授予任何人权限

这是Firebase安全规则中最常见的陷阱之一的示例:规则不是过滤器。有关这方面的更多信息,我建议查看Firebase文档中的部分、本部分或此后的部分内容

但今年早些时候情况有所改变。虽然安全规则仍然不能用于筛选数据,但它们可以用于验证查询。例如,请参见下面的示例:

这允许您通过
所有者==uid
查询时从
/baskets
读取数据。因此,现在我们授予用户访问
/baskets
,但前提是它们满足服务器端安全规则指定的条件

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

messagesRef.orderByChild('timestamp')
  .startAt(Date.now() - 600000)
  .on('child_added', (data) => {
    // do something
  })
"baskets": {
  ".read": "auth.uid != null &&
            query.orderByChild == 'owner' &&
            query.equalTo == auth.uid" // restrict basket access to owner of basket
}