【问题标题】:Firebase security rules for real-time messenger mobile App实时信使移动应用的 Firebase 安全规则
【发布时间】:2018-10-10 10:35:42
【问题描述】:

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

我的问题是我应该使用什么安全规则才能使消息线程成为私有的、可行的,并且只对参与给定消息线程的 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:我有办法使用后端来做到这一点,或者为各自线程的两个用户中的每一个制作两个副本,但这些解决方案看起来真的很次优。

【问题讨论】:

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


    【解决方案1】:

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

    所以第一步是向你的模型添加关于谁是什么成员的数据:

    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 数据库中很常见。

    要了解更多信息:

    【讨论】:

      猜你喜欢
      • 2023-02-13
      • 2020-08-08
      • 2016-08-28
      • 2020-12-28
      • 2021-10-26
      • 2021-12-05
      • 2016-06-27
      • 1970-01-01
      相关资源
      最近更新 更多