仅当节点包含用户的 uid 时才授予用户访问权限?

Grant access to a user only if the node contains their uid?

所以,我有一个具有消息传递功能的应用程序,两个用户可以在其中互相发送消息。我在 "messages" 节点中构建我的数据,其中每个节点都是两个用户之间的消息线程。每个节点都以正在通信的两个用户的两个 uid 命名,按字母顺序排序。
例如,
如果用户 (dd77gg) 和用户 (zz22ss) 在对话中,该节点将被命名为 "dd77ggzz22ss"。我知道您可以通过

在安全规则中授予访问权限
{
      "rules": {
        "messages": {
          "$uid": {
            ".read": "$uid === auth.uid",
            ".write": "$uid === auth.uid"
          }
        }
      }
    }

但是,在我的例子中,节点不是简单地命名为 $uid,而是两个 uid 合并在一起。因此,我的问题 是,仅当在节点名称的某处找到当前用户的 uid 时,我如何简单地授予访问权限?

首先,不要按字母顺序对您的 uid 进行排序,这似乎是个好主意,但它不是确定性的。例如。假设这两个 uid 是 'cat' 和 'bca'。按字母顺序对它们进行排序会得到 'aabcct'。现在假设您有另外两个 uid:'cat' 和 'cba'。如果你要对它们进行排序,你将得到相同的 uid 串联,你将得到 aabbcct。这将导致以前的对话数据被覆盖。连接两个 uid 实际上是最好的方法。你不需要对它们进行排序,你只需要有一种连接它们的确定性方法。即:我应该先放谁的 uid。

现在要回答您的问题,您只需使用 firebase 规则中的 contains 方法即可。

{
      "rules": {
        "messages": {
          "$uid": {
            ".read": "$uid.contains(auth.uid),
            ".write": "$uid.contains(auth.uid)"
          }
        }
      }
    }

您只需检查它是否包含其中一个用户 ID,如果包含,那么他们当然可以阅读它。希望对您有所帮助。