Firebase身份验证 - 从其他用户的节点获取数据,但规则设置为“.read”:“$ uid === auth.uid”

时间:2018-03-28 20:28:06

标签: firebase database-design firebase-realtime-database

对不起,如果标题令人困惑,我会在这里做得更好。

我正在阅读Firebase安全文档并遇到此页:https://firebase.google.com/docs/database/security/quickstart?authuser=0。具体来说,我在看“样本规则” - > “用户”部分包含以下代码:

// These rules grant access to a node matching the authenticated
// user's ID from the Firebase auth token
{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

假设我理解正确,您将只能在“用户”节点下读取您的数据,而其他人则无法读取。

所以在我的应用程序中,我需要检索一些关于“朋友”(朋友数,用户名,他们制作的帖子等)的数据,这些数据存储在“用户”节点中我的“朋友”用户ID下。所以它看起来像这样:

{
  "users": {
    "friend_uid": {
      "friend_count": 10,
      "username": "john",
      "posts": [
        "message": "post1"
      ],
      "age": 18,
      ...
    }
  }
}

如何根据上述权限执行此操作?如果这是一个如此常见的任务(获取有关您朋友的一些基本信息),那么为什么很多教程都会显示您应该将规则设置为我上面粘贴的内容?

开发人员如何获得他们需要的数据?他们有2个节点,“用户”和“私人用户”,在“用户”中他们存储所有公共信息以供任何人检索,“private_users”是他们存储有关用户的所有私人信息并设置更严格的读取/写规则?

或者他们是否对年龄,名称等个别属性设置了数据库规则?

1 个答案:

答案 0 :(得分:0)

您自己基本上已经给出了答案......您可以将数据节点分开并添加一个包含公共数据的对象,另一个包含私有数据,两者都有不同的访问规则。

对于用户的公共数据节点,您当然不会将规则设置为在阅读时允许完全公共访问,但也将其限制在朋友列表中的用户。

另一种选择是为各个属性设置规则,但这会使规则变得非常大且难以维护,因为需要手动将每个附加参数添加到规则中。

我在查看数据时看到的另一件事是缺少数据非规范化。每个用户对象包含该用户完成的消息/帖子列表。因此,如果您在users/UID中查询用户,则需要获取整个对象,包括可能数百万的帖子/消息。所以你绝对应该从用户对象中排除它们。