Я видел этот вопрос миллион раз, на него всегда отвечал чрезвычайно полезный @ 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 ...