我有一个角度应用程序连接到,我仍然在尝试如何指定规则。到目前为止,我有一个用户是厨房的用例(这是一个学生宿舍的应用程序),这意味着可以有X个用户,每个厨房一个,我有以下规则:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
//Only allow authenticated users to read
allow read: if request.auth != null;
}
match /kitchens/{userId}/{document=**} {
// Only the kitchen that is logged in can write to its own data
allow write: if request.auth.uid == userId;
}
}
}问题是,由于有一定数量的厨房,注册屏幕允许用户从下拉列表中选择要注册的厨房。然后根据哪些尚未注册的厨房标识进行筛选,因此我需要获得许可才能读取厨房id。我只是不想让任何人,只有厨房自己才能读取属于该厨房的数据。我试过:
match /kitchens/{id=**} {
// Unauthenticated users can read kitchens
allow read: if true;
}但是向邮递员发送http请求只会给我所有我想要的厨房下面的东西。
那么,是否有一种方法只能够读取根文档的字段,而不能读取根文件中包含的任何集合,这样我就可以看到哪些厨房已经注册,而不是厨房的居民?
发布于 2019-12-19 23:53:06
规则的这一部分给你带来了麻烦:
match /{document=**} {
//Only allow authenticated users to read
allow read: if request.auth != null;
}您可能认为它只影响“根”文档,但实际上影响到所有的文档。该**将在任何深度匹配任何文档。有了这个规则,任何经过身份验证的用户都可以读取数据库中的每个文档。
您应该删除此规则,并将其替换为更具体地满足您的需求的规则。
您在这里也有类似的问题:
match /kitchens/{id=**} {
// Unauthenticated users can read kitchens
allow read: if true;
}这允许任何人阅读厨房集合,以及*所有**嵌套文档在子集合中。同样,这就是**通配符的工作方式。
如果要将匹配限制为单个集合,请不要使用这些“贪婪”通配符。只需使用仅与即时子集合中的文档匹配的普通文档:
match /kitchens/{id} {
// Unauthenticated users can read kitchens
allow read: if true;
}您可能需要查看有关递归通配符的文档。
https://stackoverflow.com/questions/59417373
复制相似问题