【问题标题】:How to set Firebase database rules for group messaging app如何为群组消息应用设置 Firebase 数据库规则
【发布时间】:2019-05-28 16:25:51
【问题描述】:

我为群组消息应用设置了 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()"
        }
      }
    }
  }
}

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

【问题讨论】:

  • 请以文本形式包含您用于测试的代码和您的数据库结构。
  • @AndréKool 我已经添加了项目的github仓库的链接

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


【解决方案1】:
  1. 当将每个子节点定义为整数时,从零开始(就像您在 members 中所做的那样),Firebase 会自动将整个节点解释为好像是 Array of Objects,在这种情况下,您不能将它们视为它们根本就是子节点(通过调用child(auth.uid))。

    引用链接:

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

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

  2. 即使不是这样,它们都是子节点 - 你似乎调用 child(auth.uid) 好像 auth.uid 是一个整数:你的“子节点”都是 整数,而auth.uid 定义为字符串

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 2020-09-20
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多