【发布时间】:2020-06-16 18:12:13
【问题描述】:
我已经无数次看到这个问题,总是由非常有帮助的@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],因为这是我真正关心的值,但这也不起作用。无论如何,让我们先开始基本的工作......
【问题讨论】:
-
您能否分享您的安全规则的完整代码。另外,用于测试规则的确切查询是什么? (我猜不是
DB.collectionGroup("sessions").whereField("email", arrayContains: "tim@testing.com"))。 -
@RenaudTarnec 好的,我更新了问题以显示所有规则。不,这确实是用于测试的整个查询...末尾有一个
getDocuments来执行查询,也许您的意思是上面缺少该部分?
标签: firebase google-cloud-firestore firebase-security