我的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"
}
}
以下数据结构:
不幸的是,仍然可以读取存在时间超过10分钟的消息。我的代码出了什么问题?
摘要:要读取密钥的子项,必须对用户进行身份验证,并且“时间”必须小于10分钟(600000毫秒)。
我担心我没时间完成工作了!我愿意把我的恩惠奖励给解决我问题的人。
答案 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
规则位于根级别,因此适用于任何授权用户可以写入的所有内容。