如何使用Firebase构建数据以允许数据是用户特定的还是公共的?

时间:2017-07-01 10:40:27

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

我们正在使用Firebase实时数据库构建一个平台,我很难找到构建私有和公共访问数据的最佳方法。

今天我们有

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

我们所有的商品都存储在每个用户下面,以便加快购买速度。

我们的规则就像这样设置

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

因此只有授权用户才能读写数据。我可以创建这样的东西,如果值为true,则允许项目公开:

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

但这仍然是$ userUid

所以我想知道你是否有任何关于如何构建这个例子的建议,以允许项目在用户之下并且也是公开看到的,在这个用户下不是必需的,有点像Dropbox在你分享的东西时做的。

2 个答案:

答案 0 :(得分:1)

您可以像这样构建

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

现在将规则设置为

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

答案 1 :(得分:1)

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

类似地,名为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对象并调整规则。