【问题标题】:Grant access to a user only if the node contains their uid?仅当节点包含用户的 uid 时才授予用户访问权限?
【发布时间】:2017-03-19 07:49:52
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    首先不要按字母顺序对您的 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,如果包含,那么他们当然可以阅读它。我希望这会有所帮助。

    【讨论】:

    • 我的标准建议是以字典顺序的 UID 命名房间。在此处查看我的答案:stackoverflow.com/questions/33540479/… 您给出的两个示例将变为bca_cat_ 以提高可读性)和cat_cba。通过连接 UID,您可以确保相同的参与者最终会在同一个房间中并防止重复。逐个字符排序确实行不通,但我不认为 OP 以任何方式表明他们正在进行字符排序。
    • 嗯,Puf 说的。传奇! (我是这样的粉丝)。迫不及待地想在#askFirebase 的下一集中见到你。 :)
    猜你喜欢
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    相关资源
    最近更新 更多