【问题标题】:Firestore Security Rules - How to restrict users to reading only specific documents?Firestore 安全规则 - 如何限制用户仅阅读特定文档?
【发布时间】:2019-05-29 21:15:24
【问题描述】:
我想在视图中显示有关用户的公共信息,但我不希望用户能够get()我的 /users/ 中的所有用户列表{userID}/public 集合。我知道我可以限制访问,以便只有 public 集合可见。但这也会让某人清理整个数据库以查看所有公共用户。
我可以使用什么样的规则来限制访问以便指定特定文档?例如:
db.collection('users').get()
会被拒绝。但是:
db.collection('users').doc('abc123').collection('public').get()
...会成功的。
【问题讨论】:
标签:
google-cloud-firestore
firebase-security
【解决方案1】:
没有什么关于 /users/x 和 /users/x/public 之间的关系使得很难单独保护它们。它们是完全不同的集合,可以单独保护而不会发生冲突。唯一遇到问题的情况是您选择使用通常不使用的 glob 通配符。
如果您没有为 /users 指定任何规则,则不允许访问。您的第一个请求的规则是不写任何规则。 (除非您希望用户阅读他们的个人文档,否则只需编写该规则,它仍然会阻止任何人获取用户列表。)
您的第二个请求的规则可以通过以下方式为每个人启用:
match /users/{uid}/public/{id} {
allow read;
}
该规则不会立即对 /users 中的文档产生影响,因为它们与模式不匹配。任何其他匹配 /users/{uid} 的规则都不会因为同样的原因影响任何子集合 - 不匹配。
【解决方案2】:
我刚刚意识到我有点回答了我自己的问题。您可以只授予用户 public 子集合的读取权限,但阻止对特定 user 文档的访问。
对于那些稍后在这里谷歌搜索的人来说,像这样:
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;
}
}
}
}