首页 > 解决方案 > 如何为群组消息应用设置 Firebase 数据库规则

问题描述

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

我正在开发一个群组消息应用程序。代码可以在以下链接中找到。创建应用程序时,我使用的是 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()"
        }
      }
    }
  }
}

数据结构

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

标签: firebasefirebase-realtime-databasefirebase-security

解决方案


  1. 当将每个子节点定义为整数时,从零开始(就像您在 中所做的那样members),Firebase 会自动将整个节点解释为对象数组,在这种情况下您不能将它们视为全部(通过调用child(auth.uid))。

    引用链接:

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

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

  2. 即使不是这种情况,它们都是子节点 - 你似乎调用child(auth.uid)auth.uid是一个整数:你的“子节点”都是Integers,而auth.uid被定义为String


推荐阅读