我已经无数次地看到了这个问题,总是通过非常有帮助的@ doug-stevenson来回答...但是在仔细阅读这些内容后,对于我一生来说,我仍然看不到我在做什么错。
查询(快速):
DB.collectionGroup("sessions").whereField("email", arrayContains: "tim@testing.com")
我只是尝试在这样的规则中硬设置一个值(请参阅第二条规则):
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /tenants-v1/{tenantId}/{doc=**} {
allow read: if request.auth != null
&& get(/databases/$(database)/documents/tenants-v1/$(tenantId)).data.uid == request.auth.uid;
}
match /{path=**}/sessions/{session} {
allow read: if request.auth != null
&& resource.data.tenantId == 'timsolo';
}
match /{document=**} {
allow read, write: if false;
}
}
}
...,并确保/tenants-v1/timsolo/galleries/Dzim0sqH9ewwWY7C43oo/sessions/D6Ffo9VYWfcEgXaLVKJb
包含具有值字符串tenantId
的字段timsolo
。
那不能按预期工作:查询返回Missing or insufficient permissions.
健全性测试:取出上面第二条规则的最后一行(因此它只允许所有经过身份验证的请求)使此collectionGroup查询按预期工作。
这是怎么回事,为什么我不能检查resource.data
?
最终希望是对照数据中的值检查令牌上的自定义声明auth.token.tenantIds
。我宁愿检查resource['__name__'][4]
,因为这是我真正关心的值,但这也不起作用。无论如何,让我们先开始基本的工作...
答案 0 :(得分:0)
问题似乎确实来自此部分:
... && get(/databases/$(database)/documents/tenants-v1/$(tenantId)).data.uid == request.auth.uid;
如果您尝试简单地查询/tenants-v1/timsolo/galleries/Dzim0sqH9ewwWY7C43oo/sessions/D6Ffo9VYWfcEgXaLVKJb
文档,则需要在uid
文档中有一个/tenants-v1/timsolo/
字段,其值对应于已认证用户的uid。< / p>
请注意,您可以使用“规则游乐场”轻松检测到该情况,有关详细信息,请参见doc。