правила безопасности пожарного депо получают документ подбора - PullRequest
0 голосов
/ 29 мая 2019

У меня недостаточно прав для проверки безопасности пожарного депо.

service cloud.firestore
{
  match /databases/{database}/documents
  {
    match /events/{eventID}
    {
      allow read:
        if get(/databases/$(database)/documents/events/$(eventID)/authorizations/$(request.auth.uid)).data.EVENT_READ == true;
    }
  }
}

документ get жестко закодирован в базе данных firestore, и симулятор возвращает true, но для фактического запроса возвращает недостаточные привилегии.

Я протестировал и переместил подколлекцию авторизаций на тот же уровень, что и коллекция пользователей, и это работает. Я что-то упускаю?

Дополнительное тестирование: непосредственное чтение документа не приводит к недостаточным привилегиям. Я тестирую, чтобы убедиться, что это проблема с листингом, но, насколько мне известно, read должен охватывать как get , так и list в правилах безопасности firestore.

Обновление: похоже, проблема в списках. Я попытался перечислить всю коллекцию только с одним документом, и это привело к недостаточным привилегиям.

Работает:

this.angularFirestore.collection('events').doc(eventID).valueChanges();

Не работает (обновлено):

this.angularFirestore.collection('events', query => query.where('admins', 'array-contains', auth.uid)).valueChanges()

Моя база данных пожарного магазина:

/events/event1_id
- field 1: some string
- field 2: some string
- admins: array of uid strings
    /authorizations/<uid>  #uid for $(request.auth.uid)
    - EVENT_READ: true

Обновление 2: обновлена ​​неработающая строка запроса, которую я опробовал. Интересно, что если я переместу подколлекцию / authorizations на тот же уровень, что и коллекции / events, запрос не будет завершен неудачей.

1 Ответ

0 голосов
/ 29 мая 2019

Ваш первый запрос работает, потому что он обращается к коллекции events с определенным документом. Этот конкретный документ соответствует критериям правил, потому что вы настроили get() на его разрешение.

Ваш второй запрос не работает, потому что он пытается получить всех документов в коллекции events. Ваше правило специально не допускает этого. Похоже, вы ожидаете, что ваше правило отфильтровывает события, доступ к которым запрещен, на основе содержимого неизвестного количества других документов. Вы должны знать, что правила безопасности не являются фильтрами . Пожалуйста, ознакомьтесь с документацией и прочитайте этот раздел. Клиент должен запрашивать только те документы, которые, как известно, читаются в соответствии с правилами. Это не может зависеть от правил фильтрации документов, которые не разрешены.

Если вы хотите иметь возможность запрашивать все события, к которым у текущего пользователя есть доступ, ваша текущая структура базы данных не будет работать. Вам нужно будет поместить всю необходимую информацию в саму коллекцию событий. Это означает, что вы должны рассмотреть что-то вроде ввода UID каждого пользователя, которому разрешено читать событие в самом документе, а затем выполнить фильтрацию по этому полю. Или есть какая-то другая коллекция, которую вы можете запросить таким образом.

...