我想在视图中显示有关用户的公共信息,但我不希望用户能够 get()我的 / users /中所有用户的列表{userID} / public 集合。我知道我可以限制访问权限,以便只有 public 集合可见。但这也可以使某人清理整个数据库以查看所有公共用户。
我可以使用哪种规则来限制访问权限,以便指定特定的文档?例如:
db.collection('users').get()
将被拒绝。但是:
db.collection('users').doc('abc123').collection('public').get()
...将会成功。
答案 0 :(得分:0)
关于/ users / x和/ users / x / public之间的关系,没有什么东西使得很难分别保护它们。它们是完全不同的集合,可以独立保护而不会发生冲突。唯一的问题就是是否选择使用通常不使用的通配符。
如果您未为/ users指定任何规则,则将不允许访问。您的第一个请求的规则是不写任何规则。 (除非您希望用户阅读他们的个人文档,然后只写该规则,否则它仍然会阻止任何人获取用户列表。)
只需编写以下内容即可为所有人启用第二个请求的规则
match /users/{uid}/public/{id} {
allow read;
}
该规则将立即对/ users中的文档无效,因为它们与模式不匹配。同样,与/ users / {uid}匹配的任何其他规则也不会由于相同原因-不匹配而影响任何子集合。
答案 1 :(得分:0)
我刚刚意识到自己已经回答了自己的问题。您可以仅授予您的用户公开子集合的读取权限,但可以阻止访问特定的 user 文档。
对于以后在这里使用Google搜索的人来说,是这样的:
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userID} {
allow read, write, delete: if isAdmin();
match /public/{publicID} {
allow read: if request.auth.uid != null;
}
}
}
}