【发布时间】:2018-03-21 22:19:19
【问题描述】:
我目前正在尝试在 firebase 上构建小型应用程序作为对其的评估。 它看起来很有趣,而且效率很高,但我对 Firestore 规则有一个问题。
我有一个集合(游戏),其中的对象看起来像这样:
{
"name":String,
"description":String,
"owners":
{
"uid": String
"uid2": String
}
}
而规则是这样设置的:
service cloud.firestore {
match /databases/{database}/documents {
match /games {
match /{game} {
allow write: if request.auth != null && request.resource.data.owners[request.auth.uid] == 'ADMIN';
allow update: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN';
allow read: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN';
}
}
}
}
在编写时,更新工作正常。只读适用于单个文档。 当我尝试读取集合时,我收到访问错误,好像用户无权访问它。使它不起作用的部分是
resource.data.owners[request.auth.uid] == 'ADMIN'.
向集合查询添加where("owners."+auth.uid,"==", 'ADMIN') 也无济于事。
我在这里做错了什么? Firebase Firestore 中是否有针对类似情况的建议方法?
编辑: 我尝试像这样添加“get”和“list”规则:
allow list: if request.auth != null;
allow get: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN';
它没有按预期工作。我希望它允许我列出带有where 的文档,但如果有一个我不能get 的文档,我希望得到“权限缺失或权限不足”。我能够做的是列出所有文档,但不直接阅读其中一些文档(get 规则在尝试获取单个文档时有效,但在从集合中列出它们时无效)。
编辑 2:根据@MikeMcDonald 看来,我的预期是正确的,但它目前有问题。等待修复。
编辑 3:现在可以正常使用以这种方式获取和列出设置的规则:
allow get, list: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN';
【问题讨论】:
-
请注意,
write是update的超集,因此您当前的write规则将覆盖update。将其更改为create,您将更接近您的预期目标。 -
@MikeMcDonald 谢谢,我会这样做的。我还发现(仔细阅读后)有两个“阅读”。
get和list稍后我将尝试允许更广泛的列表,也许这是我需要的东西。谢谢! -
read是包含get和list的伞。我已经确认以上是一个错误——它应该可以工作,但是我们在这里没有正确处理数组成员。修复完成后,我会在这里跟进。 -
@MikeMcDonald 谢谢。现在这对我来说并不是超级关键,因为我正在使用 firebase 开始我的冒险,但能够做到这一点会很好。等待修复的好消息 :-)
-
我已经确认这个错误现在已经修复,所以你应该可以正确使用嵌套属性了。
标签: firebase firebase-security google-cloud-firestore