如何为群组消息传递应用程序设置Firebase数据库规则

时间:2019-01-01 22:02:45

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

我为群组消息传递应用程序设置了Firebase数据库规则。但是现在,即使经过身份验证的用户尝试发送消息,也不会显示该消息。

我正在使用群发消息应用程序。可以在以下link中找到该代码。创建应用程序时,我使用的是Firebase数据库的默认规则。但是现在我正在尝试设置规则,以便成员节点中所有可用的uid都可以查看该特定组或将消息发送到该特定组。以下是我创建的最新规则集。下面是我创建计划后的详细数据库结构。请注意,我正在使用Firebase电话身份验证。因此,我正在创建一个用户节点,该节点针对每个注册号码跟踪uid。当用户选择要添加到组中的成员时,我将根据其各自的uid检查这些编号,然后将这些uid添加到成员的节点中。

{
  "rules": {
    "plan":{
      "$planID":{
        "messages":{
          ".read":"data.parent().child('members').child(auth.uid).exists()",
          ".write":"data.parent().child('members').child(auth.uid).exists()"
        }
      }
    }
  }
}

Data Structure

我希望已添加到成员节点的经过身份验证的用户能够阅读和发送消息,但是即使上述注册用户本身也无法在上述规则发布后创建新组或阅读消息。

1 个答案:

答案 0 :(得分:0)

  1. 在将每个子节点定义为Integers时,从零开始(就像您在members中所做的那样),Firebase会自动将整个节点解释为Array of Objects,在这种情况下情况下,您根本无法将它们视为子节点(通过调用child(auth.uid))。

    从链接中引用:

      

    特别是,如果所有键都是整数,并且对象中0和最大键之间的键中有一半以上具有非空值,则Firebase会将其呈现为数组。记住这一点很重要。

    由于在您的数据结构中就是这种情况,所有members'子节点都不再被视为节点。它们是数组项,因此不是children中的members

  2. 即使不是这种情况,它们也都是子节点-您似乎将child(auth.uid)当作整数来调用auth.uid:您的“子节点”是所有整数,而auth.uid定义为字符串