Firestore安全规则-如何限制用户仅阅读特定文档?

时间:2019-05-29 21:15:24

标签: google-cloud-firestore firebase-security-rules

我想在视图中显示有关用户的公共信息,但我不希望用户能够 get()我的 / users /中所有用户的列表{userID} / public 集合。我知道我可以限制访问权限,以便只有 public 集合可见。但这也可以使某人清理整个数据库以查看所有公共用户。

我可以使用哪种规则来限制访问权限,以便指定特定的文档?例如:

db.collection('users').get()

将被拒绝。但是:

db.collection('users').doc('abc123').collection('public').get()

...将会成功。

2 个答案:

答案 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;
            }
        }
    }
}