Правила безопасности запросов Firebase collectionGroup не работают - PullRequest
0 голосов
/ 16 июня 2020

Я видел этот вопрос миллион раз, на него всегда отвечал чрезвычайно полезный @ doug-stevenson ... но, хоть убей, после внимательного прочтения этих вопросов я все еще не понимаю, что я делаю не так.

Query (swift): 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], потому что это значение меня действительно волнует, но это тоже не работает. В любом случае, давайте сначала заработаем basi c ...

1 Ответ

0 голосов
/ 16 июня 2020

Кажется, проблема действительно исходит из этой части:

... && get(/databases/$(database)/documents/tenants-v1/$(tenantId)).data.uid == request.auth.uid;

Если вы попытаетесь просто запросить документ /tenants-v1/timsolo/galleries/Dzim0sqH9ewwWY7C43oo/sessions/D6Ffo9VYWfcEgXaLVKJb, вам понадобится поле uid в документе /tenants-v1/timsolo/ со значением, соответствующим uid аутентифицированного пользователя.


Обратите внимание, что вы можете легко обнаружить это, используя «Игровую площадку для правил», см. do c для получения дополнительной информации инфо.

...