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

Firebase 仅当节点包含用户的uid时才授予用户访问权限?,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,所以,我有一个应用程序,它有一个消息功能,两个用户可以互相发送消息。我在“messages”节点中构造数据,其中每个节点都是两个用户之间的消息线程。每个节点都以正在通信的两个用户的两个uid命名,按字母顺序排序。 例如, 如果用户(dd77gg)和用户(zz22ss)正在对话中,则该节点将命名为“dd77ggzz22ss”。我知道您可以通过执行以下操作来授予安全规则中的访问权限 { "rules": { "messages": { "$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实际上是最好的方法。您不需要对它们进行排序,只需要使用一种确定的方式来连接它们。Ie:我应该把谁放在第一位

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

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

您只需检查它是否包含一个用户id,如果包含,那么他们当然可以读取它。我希望这能有所帮助。

我的标准建议是以按字典顺序排列的UID命名房间。请看我的回答:您给出的两个示例将成为
bca\u cat
\uu
用于可读性)和
cat\u cba
。通过连接UID,您可以确保相同的参与者最终会出现在同一个房间中,并防止重复。一个字符一个字符的排序确实不起作用,但我认为OP并没有以任何方式表明他们在进行字符排序。传奇(我真是个粉丝)。迫不及待地想在《askFirebase》的下一集看到你