Firebase:如何构建公共/私有用户数据

时间:2016-07-29 00:18:47

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

当然,我的数据库中的用户拥有可以公开访问的信息以及他们应该看到的其他信息。我正在考虑两种不同的方法来实现它。

选项1:只有该用户可以读取/users/$uid且任何人都可以读取/users/$uid/profile

选项2:仅保留/users/$uid只有该用户可读,并且/profiles/$uid是公开的。这遵循了更扁平的数据结构的建议,但我不知道在这种情况下它是如何更好。

1 个答案:

答案 0 :(得分:18)

了解“更平坦”结构为何更好的最简单方法是查看如何保护它以及如何实现功能。

你的第一个结构是:

users: {
  uidOfJacob: {
    stackId: 884522,
    ssn: "999-99-9999",
    profile: {
      displayName: "Jacob Philips"
    }

  },
  uidOfPuf: {
    stackId: 209103,
    ssn: "999-99-9999",
    profile: {
      displayName: "Frank van Puffelen"
    }
  }
}

你可以通过以下方式保护它:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
        "profile": {
          ".read": true
        }
      }
    }
  }
}

获取公共信息的主要原因之一是能够显示该信息的列表。在JavaScript中:

ref.child('users').child(???).child('profile').on('child_added'...

这不起作用,因为我们在???中放了什么。 Firebase操作需要能够从一个位置读取整个列表,并且用户需要对整个位置具有读取权限(而不仅仅是对各个子节点)。

如果我们构建数据以将公共信息与私人信息分开,我们得到:

users: {
  uidOfJacob: {
    stackId: 884522,
    ssn: "999-99-9999",
    profile: {
      displayName: "Jacob Philips"
    }

  },
  uidOfPuf: {
    stackId: 209103,
    ssn: "999-99-9999",
    profile: {
      displayName: "Frank van Puffelen"
    }
  }
},
"profile": {
  uidOfJacob: {
    displayName: "Jacob Philips"
  },
  uidOfPuf: {
    displayName: "Frank van Puffelen"
  }
}

你可以通过以下方式保护它:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
      }
    },
    "profiles": {
      ".read": true,
      "$uid": {
        ".write": "auth.uid == $uid"
      }
    }
  }
}

不要获取公共用户个人资料列表,您可以:

ref.child('profiles').on('child_added'...

这样可行,因为每个人都有profiles的读取权限。