【发布时间】:2021-10-06 19:39:37
【问题描述】:
我正在尝试在 Cloud Firestore 中设置基于角色的身份验证。目的是对其进行设置,以便只有组织内的用户才能阅读组织或相关事件。它在客户端请求单个文档(get)而不是文档查询(list)时起作用。
我的名为 organizations 的集合看起来像这样,到目前为止只包含一个 ID 为 devtest 的文档:
{
"name": "Dev Test"
"users": [
"STFg0EvGemTaD2r9jyby0UMSt6O2"
]
"orgid": "devtest"
}
我也收藏了events(目前也只包含一个):
{
"name": "foo",
"orgid": "devtest",
...
}
我的规则是这样的:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function isSignedIn() {
return request.auth != null;
}
function userIsUser() {
return isSignedIn() &&
request.auth.uid in get(/databases/$(database)/documents/organizations/$(resource.data.orgid)).data.users;
}
match /organizations/{org} {
allow read: if userIsUser();
allow write: if false;
}
match /events/{event} {
allow read: if userIsUser();
allow write: if userIsUser();
}
}
}
我很困惑的是为什么我可以做一个 get 并且它成功了,例如:
firebase.firestore().collection('organizations').doc('devtest').get()
但是当我尝试查询时它会失败,例如:
firebase.firestore().collection('organizations').where('users', 'array-contains', firebase.auth().currentUser ? firebase.auth().currentUser.uid : false)
响应权限被拒绝。我知道安全规则不是过滤器,现在集合中只有一个文档。
对我可能遗漏的内容有什么建议吗?
谢谢!
【问题讨论】:
标签: javascript google-cloud-firestore firebase-security