我的情况类似于this,但是由于某种原因,那里的解决方案不起作用。我试图将对集合中文档的读取限制为仅对该文档列为“管理员”的人员。示例数据:
projects/ id001/ name: 'Project 1' roles: { uid001: 'admin' } id002/ name: 'Secret Project' roles: { }
因此,我的uid
用户中uid001
的用户应该能够读取Project 1
,但没有其他内容。我的安全规则是:
match /projects/{projectId} { allow read: if get(/databases/$(database)/documents/projects/$(projectId)).data.roles[request.auth.uid] == 'admin'; allow write: if false; }
现在,如果我明确要求有关文档:
return firebase.firestore().collection('projects')
.doc('id001')
.get().then(snapshot => {
return snapshot
})
一切都很好,并且正如预期的那样,尝试获取项目id002
失败。但是,当尝试查询文档时,应该允许我访问:
return firebase.firestore().collection('projects')
.where('roles.uid001', '==', 'admin')
.get().then(snapshot => {
return snapshot.docs
})
然后整个查询以Missing or insufficient permissions.
失败。我在网上发现的许多类似示例似乎都使用了这种方法,但是事实是不允许客户端 read 的事实意味着.where()
查询无法按顺序访问数据筛选我们不可用的文件?那是我唯一的结论,但是似乎有很多人正在努力,我想知道我是否还缺少其他东西。