如何使用 Firebase 构建数据以允许数据是用户特定的并且 public?

How to structure data with Firebase to allow data to be user specific and also public?

我们正在使用 Firebase Realtime Database 构建一个平台,我正在努力寻找最佳方式来构建我们的数据以供私有和 public 访问。

今天我们有

database: {
  items: {
    $userUid: {
      $itemUid: {
        poster_link: "..."
        format: "..."
        title: "..."
      }
    }
  }
}

我们所有的项目都存储在每个用户下,以便快速和安全地加载。

我们的规则是这样设置的

{
  "rules": {
    "items": {
      "$userId": {
        "$itemId": {
          ".read": "auth !== null,
          ".write": "auth !== null"
        }
      }
    }
  }
}

因此只有授权用户才能读取和写入数据。如果值为真,我可以创建这样的东西以允许项目 public:

".read": "auth !== null || data.child('public').val() == true"

但这仍将在 $userUid

所以我想知道您是否有任何关于如何构建此示例以允许项目在用户下并且还看到 publicly,在该用户下没有必要的建议,有点像 Dropbox 做的时候你分享了一些东西。

你可以这样构造

database: {
  items: {
      $itemUid: {
        poster_link: "..."
        format: "..."
        title: "..."
        user: "userid"
      }
  }
}

现在将规则设置为

{
  "rules": {
    "items": {
        "$itemId": {
          ".read": "auth !== null || data.child('public').val() == true,
          ".write": "auth !== null"
        }
    }
  }
}

您选择的数据结构没有利用 Firebase 的平面数据原则。这将使您很难查询多个用户的项目。例如,如何在不深入每个用户的情况下获取所有 public 项?

同样,一个叫做public的布尔值也不好,因为你不能将它扩展到其他ACL场景。更好的是将来可以扩展的 ACL 对象。

例如:

items: {
  itemsUid: { 
    [...],
    userId: ...,
    ACL: { public: true }
  }
}

现在您可以编写规则了:

auth !== null && (root.child(items/ACL/public).exsists() || data.userId === auth.UID)

如果您在三个月内添加可以看到您的帖子的朋友或可以看到您的项目的关注者的概念,您只需将 friends: true, followers: true 添加到 ACL 对象并调整规则即可。