我按照文档设置规则。这是一个简单的聊天应用程序,我想只检索最近的消息(即在最后X分钟创建的消息)。我发现了以下document并尝试了完全相同的事情。
结构的
规则的
{
"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
})
希望有人可以帮我解决规则!
答案 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 }
允许/baskets
按owner == uid
查询。所以现在我们授予用户/baskets
的访问权限,但前提是它们符合我们服务器端安全规则指定的条件。
不幸的是,我上次检查时,当前timestamp
在查询中不可用,因此无法编写仅允许您的变通方法查询的规则。