【发布时间】:2021-07-17 02:13:09
【问题描述】:
假设我有一个restaurants 集合和menus 子集合。餐厅权限设置在餐厅文档中,如下所示:
餐厅
{
"roles": {
"user123": "Owner"
}
}
有权访问该餐厅的任何人也可以访问其任何子集合,包括 menus 子集合。以下是安全规则:
安全规则
match /restaurants/{restaurantId}/{document=**} {
allow read: if resource.data.roles[request.auth.uid] > '' ;
}
查询餐厅列表可以这样完成,效果很好:
餐厅查询
firebase
.firestore()
.collection('restaurants')
.where(`roles.${uid}`, '>', '');
现在如何查询menus 子集合?我了解 Firestore 需要在不查看基础数据的情况下根据查询推断权限。从逻辑上讲,这应该是可能的,因为任何可以访问restaurant 的人也可以访问menus 子集合。但是我如何编写这个 menus 子集合查询以便 Firestore 可以推断出来呢?我能想到的最合乎逻辑的查询是这样的:
查询菜单子集合(不起作用)
firebase
.firestore()
.doc(`restaurants/${restaurantId}`) // user has access to this restaurant
.collection('menus');
...但这不适用于权限被拒绝。
【问题讨论】:
-
=**中的match /restaurants/{restaurantId}/{document=**}表示该规则适用于餐厅文档及其下的所有内容。但是这些菜单是否满足此要求:resource.data.roles[request.auth.uid] > ''? -
@FrankvanPuffelen 哦,这是一个很好的观点。菜单中没有
roles,所以这可能是问题所在。我最初尝试过这个:get(/databases/$(database)/documents/restaurants/$(restaurantId)).data.roles[request.auth.uid] > '',但它看起来不像get和exists允许用于列表查询。你知道我该怎么做吗? -
如果需要,我不介意为
menus子集合创建另一条规则,但即便如此,我也不确定如何让 Firestore 根据父restaurant中的roles。
标签: firebase security google-cloud-firestore firebase-security