我们正在使用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在你分享的东西时做的。
答案 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对象并调整规则。