Firebase集合组查询安全规则不起作用

时间:2020-06-16 18:12:13

标签: firebase google-cloud-firestore firebase-security

我已经无数次地看到了这个问题,总是通过非常有帮助的@ 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],因为这是我真正关心的值,但这也不起作用。无论如何,让我们先开始基本的工作...

1 个答案:

答案 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