我正在做一个groceryItem应用程序,用户可以添加项目,只能看到自己的项目
我使用childByAutoId
添加我的项目,并为每个项目获取唯一的密钥条目(参见图片#1)。
每个项目都有3个属性。 addedByUser
是经过身份验证的用户的UID,当然还有名称和数量。
我在设置规则时遇到问题,以便只有用户才能看到自己的项目。我现在的规则是这样的(见图2)。
如果我与其他用户登录,他可以阅读所有项目。所以我的问题是: 如何让创建它们的用户可读取项目?
我认为items
和addedByUser
之间存在差距,因为我之间有childByAutoId
。如果您有任何解决方案或提示我如何以更好的方式构建它,请随时帮助我。
提前致谢!
答案 0 :(得分:2)
$ addedByUser可能在此示例中位于错误的位置,因为它不是项目的“嵌套子项”,而是子项的属性。我建议(没有测试过这个)你会找到类似的东西:
"items": {
"$item": {
".read": "data.child('addedByUser').val() === auth.uid"
}
}
这取自Firebase docs:
使用数据:
{
"messages": {
"message0": {
"content": "Hello",
"timestamp": 1405704370369
},
"message1": {
"content": "Goodbye",
"timestamp": 1405704395231
},
...
}
}
规则可以是:
{
"rules": {
"messages": {
"$message": {
// only messages from the last ten minutes can be read
".read": "data.child('timestamp').val() > (now - 600000)",
// new messages must have a string content and a number timestamp
".validate": "newData.hasChildren(['content', 'timestamp']) && newData.child('content').isString() && newData.child('timestamp').isNumber()"
}
}
} }
这样可以防止错误的用户阅读别人的(单数)项目,并且在您的示例中会阻止用户SZ825V ...对“items / -KKTDD ...”执行读取,但是如果用户SZ825V是对“项目”执行读取,然后读取将完全失败,因为用户正在尝试阅读他们自己的文档和其他人的文档。这是firebase中的一个重要概念,规则以原子方式运行 - 也就是说,如果读取的一部分失败,则整个读取都会执行。另一种表达方式是规则不作为过滤器。 如果这是您正在寻找的功能,则可能需要重新排列您的结构。一个例子如下:
{
"users": {
"abcdef-user-id": {
"items": {
"fjeiwofjewio": {
"name": "apple",
"qty": "23"
}
}
},
"ghijkl-user-id": {
"items": {
"regrewgreh": {
"name": "passionfruit",
"qty": "18"
}
}
}
}
和安全规则可能是:
.. {
"users": {
"$userId": {
".read": "auth.uid === $userId"
}
}
}
上述方法假设您只希望允许用户读取其用户自己的数据树中的项目,是否其他任何人都无法看到任何其他用户的项目。如果您确实希望其他用户看到其他用户的某些项目,则需要再次采用不同的方法,这将是另一个SO问题。