【发布时间】:2021-01-06 17:44:56
【问题描述】:
为了适应 Cloud Firestore,我一直在开发聊天应用程序。
下面是它的数据库结构。
rooms
├ xxxxxx
│ ├ messages
│ │ ├ xxxxxx
│ │ └ xxxxxx
│ └ private
│ └ allowed - members [xxxxxxxx, xxxxxxxx]
└ xxxxxx
├ messages
│ ├ xxxxxx
│ └ xxxxxx
└ private
└ allowed - members [xxxxxxxx, xxxxxxxx]
每个聊天室文档下的private子集合都有一个文档,其ID为allowed。allowed有members,这是一个数组字段,包含允许使用聊天的用户的ID房间。
要获取特定聊天室,我首先要做的是获取allowed 文档,如下所示:
db.collectionGroup('private')
.where('members', 'array-contains', userId)
.get()
.then(...)
我已经在private 上为集合组查询创建了一个索引,所以上面的代码有效。
但是,如果我添加以下安全规则,它会失败并显示错误消息“未捕获(承诺中)FirebaseError:缺少权限或权限不足。”
match /{path=**}/private/{document} {
allow read: if request.auth.uid
in get(/databases/$(database)/documents/$(path)/private/$(document)).data.members;
}
此规则用于禁止非房间成员的用户访问allowed。
没有.where(...) 的查询会导致同样的错误。
另一方面,以下规则按预期工作。
match /{path=**}/private/{document} {
allow read: if request.auth.uid in resource.data.members;
}
我知道这条规则要好得多,所以我肯定会使用它,但我仍然想知道为什么以前的规则不起作用。
有人能解释一下原因吗?
这有什么关系吗?
【问题讨论】:
标签: google-cloud-firestore firebase-security