gpt4 book ai didi

实时信使移动应用的 Firebase 安全规则

转载 作者:行者123 更新时间:2023-12-04 12:43:44 25 4
gpt4 key购买 nike

我正在使用 Ionic/Angular 和 Firebase 构建一个实时信使。我使用 Firebase 身份验证对我的用户进行身份验证,并使用 Firebase DB 来存储消息和消息线程。

我的问题我应该使用什么安全规则才能使消息线程是私有(private)的、可行的,并且只能对参与给定消息线程的 2 个人进行写入。

我的数据库结构现在看起来像这样:

-chats
--Message_thread_ID
---Unique_ID_generated_message by Firebase
----Message
----Sender ID
----Receiver ID
---Unique_ID_generated_message by Firebase
----Message
----Sender ID
----Receiver ID
--Message_thread_ID
---Unique_ID_generated_message by Firebase
----Message
----Sender ID
----Receiver ID

我目前的 Firebase 安全规则是:
{
"rules": {
".read": "auth != null",
".write": false,
"$messageThreadID": {
".write": "auth != null && !data.exists()",
".read": "auth != null"
}
}
}

这工作正常,但这样任何经过身份验证的用户都可以读取任何用户之间的所有消息。这不是我想要的。我想将消息线程保密给任何给定线程中的两个用户。

我应该如何重组我的数据库以获得最佳解决方案?

PS:我有办法使用后端来做到这一点,或者为各自线程的两个用户中的每个用户制作两个副本,但这些解决方案看起来真的很次要。

最佳答案

您当前的数据模型仅存储聊天消息本身。它尚未存储每个聊天的参与者。或者……它确实将其存储在消息本身中,但这还不够明确,您的安全规则无法读取它。

因此,第一步是将数据添加到您的模型中,说明谁是什么的成员:

members
Message_thread_ID1
member_uid_1: true
member_uid_2: true
Message_thread_ID2
member_uid_1: true
member_uid_3: true

现在我们拥有更新安全规则所需的所有信息。
{
"rules": {
".read": "auth != null",
".write": false,
"$messageThreadID": {
".write": "root.child('members').child($messageThreadID).child(auth.uid).exists()",
}
}
}

现在,如果用户是该线程的成员,则他们只能写入消息线程。

对于应用程序的各种用例,您通常会得到多个这样的查找列表。例如,您可能希望在用户登录时为其显示消息线程列表。为了有效地做到这一点,您可能会添加一个“每个用户的消息线程”列表,这几乎是 members 的倒数上面的列表:
threads_per_user
member_uid_1: true
Message_thread_ID1
Message_thread_ID2
member_uid_2: true
Message_thread_ID1
member_uid_3: true
Message_thread_ID2

对于来自关系/SQL 背景的开发人员来说,这种数据结构最初感觉很不自然,但实际上在 NoSQL 数据库中很常见。

了解更多:
  • 阅读 NoSQL data modeling
  • watch Firebase for SQL developers
  • watch Get to Know Cloud Firestore
  • Many to Many relationship in Firebase
  • Firebase query if child of child contains a value
  • 关于实时信使移动应用的 Firebase 安全规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50098693/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com