Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 通过安全规则中的某个子值限制查询_Firebase_Firebase Realtime Database_Firebase Security - Fatal编程技术网

Firebase 通过安全规则中的某个子值限制查询

Firebase 通过安全规则中的某个子值限制查询,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我正在努力想出最好的方法来构造我的数据库的一部分及其相关的安全规则 我有聊天组,用户可以随时添加到这些组中。当用户被添加到组中时,他们应该只能检索此后发送的消息。在他们(用户)被添加到组之前,他们不可能检索任何发送的消息 我的第一种方法错误地假设安全规则只适用于被查询的数据 为了简化这个问题,我有以下结构: { “团体”:{ “-Kb9fw20GqapLm_b8JNE”:{ “姓名”:“酷人” } }, “组用户”:{ “-Kb9fw20GqapLm_b8JNE”:{ “3JzxHLv4b6Tc

我正在努力想出最好的方法来构造我的数据库的一部分及其相关的安全规则

我有聊天组,用户可以随时添加到这些组中。当用户被添加到组中时,他们应该只能检索此后发送的消息。在他们(用户)被添加到组之前,他们不可能检索任何发送的消息

我的第一种方法错误地假设安全规则只适用于被查询的数据

为了简化这个问题,我有以下结构:

{
“团体”:{
“-Kb9fw20GqapLm_b8JNE”:{
“姓名”:“酷人”
}
},
“组用户”:{
“-Kb9fw20GqapLm_b8JNE”:{
“3JzxHLv4b6TcUBvFL64Tyt8dTXJ2”:{
“添加时间”:1230779183745
},
“S2GMKFPOHVHZL7Q4XAVFIHTMRC3”:{
“添加时间”:1480113719485
}
}
},
“群发邮件”:{
“-Kb9fw20GqapLm_b8JNE”:{
“-KbKWHv4J4XN22aLMzVa”:{
“from”:“3JzxHLv4b6TcUBvFL64Tyt8dTXJ2”,
“文本”:“你好”,
“timeSent”:“1358491277463”
},
“-KfHxtwef6_S9C5huGLI”:{
“发件人”:“S2GMKFPOHVHZL7Q4XAVFIHTMRC3”,
“文本”:“再见”,
“timeSent”:“1493948817230”
}
}
}
}
这些安全规则:

{
“规则”:{
“群发邮件”:{
“.indexOn”:“timeSent”,
“$groupKey”:{

.read:“root.child('groupUsers').child(auth.uid).child($groupKey).child('timeAdded').val()读取规则在附加侦听器的位置强制执行

因此,在您的情况下,即
groupMessages/-Kb9fw20GqapLm_b8JNE
。如果您的用户具有读取权限,则允许侦听器。如果用户没有读取权限,则拒绝/取消侦听器

这意味着规则不能用于过滤数据。我们通常将其称为“规则不是过滤器”,这是Firebase安全模型新手最常见的陷阱之一。请参阅:

  • Firebase文档中的部分
  • 先前的
你的规则本身并没有错:它们只允许访问每个不太老的特定子级。它们不再允许你对
groupMessages/-Kb9fw20GqapLm\u b8JNE
运行查询

解决此问题的常用方法是使用单独的结构(通常称为“索引”),其中包含查询将返回的项的键。在您的情况下,这可能会变成每个用户的索引,其中包含加入后的所有消息的键


但是,老实说,听起来你在试图以SQL方式使用安全规则。似乎不允许用户查看较旧的消息。更可能的是,你不希望用户被较旧的消息打扰。在这种情况下,我只需要通过查询(正如你已经有的)来解决它,并删除
”。请阅读“
规则。

读取规则在附加侦听器的位置强制执行

因此,在您的情况下,即
groupMessages/-Kb9fw20GqapLm_b8JNE
。如果您的用户具有读取权限,则允许侦听器。如果用户没有读取权限,则拒绝/取消侦听器

这意味着规则不能用于过滤数据。我们通常将其称为“规则不是过滤器”,这是Firebase安全模型新手最常见的陷阱之一。请参阅:

  • Firebase文档中的部分
  • 先前的
你的规则本身并没有错:它们只允许访问每个不太老的特定子级。它们不再允许你对
groupMessages/-Kb9fw20GqapLm\u b8JNE
运行查询

解决此问题的常用方法是使用单独的结构(通常称为“索引”),其中包含查询将返回的项的键。在您的情况下,这可能会变成每个用户的索引,其中包含加入后的所有消息的键


但老实说,听上去你是在试图以SQL方式使用安全规则。似乎不允许用户查看较旧的消息。更可能的是,你不希望用户被较旧的消息打扰。在这种情况下,我只需要通过查询(正如你已经有的)来解决它,并删除
。.read”
规则。

是的,我在阅读了这些文档后就这么想。我在谷歌上搜索了一下,似乎找不到任何替代方法,所以我想我应该问一下。有什么建议吗?你能给我指一下我可以阅读的资源吗?谢谢你的回答:)是的,我分心了。现在添加了更多信息。谢谢你的编辑!我关于“索引”的思考早些时候,我试图避免这样做,尽管这似乎是最好的解决方案。我可以在每封新邮件中触发一个函数,为组中当前的每个用户将邮件密钥复制到单独的结构中。这种方法的主要问题是,快速连续发送的邮件可能会暂时出现在ord之外呃,因为函数的运行顺序并不总是与它们被触发的顺序相同。我希望不限制基于日期可以检索哪些消息是一个选项,但它不在这个特定的应用程序中,我在阅读文档后认为是这样。在谷歌搜索之后,我似乎找不到任何替代方法,所以我想我应该问一下。有什么问题吗ggestions?你能给我指一下我能读到的一些资料吗?谢谢你的回答:)是的,我分心了。现在添加了更多信息。谢谢编辑!我之前考虑过“索引”,但我试图避免这样做,尽管它看起来像是b