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

时间:2017-03-18 22:40:39

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

相关问题