【发布时间】:2020-05-17 06:29:27
【问题描述】:
当我引入规则时,我在查询 Firestore 时遇到权限被拒绝错误。我已经缩小了我的复杂规则并过滤到以下 2 个示例,其中一个查询有效,一个查询无效。我不明白我失败的查询出了什么问题。
来自https://cloud.google.com/firestore/docs/security/rules-query 我了解规则不是过滤器。根据该文档:“如果查询可能返回客户端无权读取的文档,则整个请求将失败。”。
考虑到这一点,我一直在迭代我的规则、过滤器和数据,并提供以下内容:
数据: 我的集合中没有名为“MyCollection”的数据。事实上,集合“MyCollection”从未存在过。
规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /MyCollection/{id} {
allow read: if (
(resource.data.readAccess == 0)
)
allow write: if (true)
}
}
}
我的失败查询(我的权限被拒绝错误):
Firestore.instance.collection('MyCollection')
.where("readAccess", isLessThanOrEqualTo: 0)
.getDocuments()
.then((_) => print("Success!"));
当我运行此查询时,我收到以下错误:
W/Firestore(12491): (21.3.0) [Firestore]: Listen for Query(MyCollection where readAccess <= 0) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
我的成功查询: (这个查询的唯一区别是我用 isEqualTo 替换了“isLessThanOrEqualTo”)
Firestore.instance.collection('MyCollection')
.where("readAccess", isEqualTo: 0)
.getDocuments()
.then((_) => print("Success!"));
评论:
- 当我用数据填充 MyCollection 时,我得到了相同的结果。
-
看起来查询是根据规则验证的,而不是文档https://cloud.google.com/firestore/docs/security/rules-query 所述的“潜在返回文档”。如果是这种情况,我想知道如何将以下规则转换为过滤器:
(resource.data.readAccess == 0) || ((request.auth != null) && (resource.data.readAccess <= get(/databases/$(database)/documents/App/$(resource.data.appId)).data.group[request.auth.uid]) ) 此规则非常相似,只是它针对已登录用户的数据应用程序的“应用”文档中的组访问级别验证文档的 readAccess 级别。如果我无法匹配一个简单规则的查询,我无法想象我需要为这个复杂的规则做什么。
请指教。非常感谢。
【问题讨论】:
标签: google-cloud-firestore firebase-security