Как ограничить количество документов, запрашиваемых в правилах безопасности Firestore? - PullRequest
0 голосов
/ 20 января 2019

Мы разрабатываем SaaS-решение для спортивных залов и фитнес-центров.

Есть 3 пакета.Первый бесплатный для первых 50 участников, которые они добавляют в систему.Затем требуется обновление, чтобы добавить больше участников.

Существует правило безопасности, запрещающее добавление новых участников после достижения этого предела.Проблема в том, что если подписка обновляется, а затем понижается.

Допустим, они обновились, добавили в общей сложности 100 участников, а затем понизили их до бесплатного плана, включающего только 50 участников.

В этомЕсли мы хотим, чтобы они могли получить только последние 50 участников, которые они добавили в коллекцию участников.Другими словами, мы хотим ограничить доступ к запросу более 50 документов членов.

match /_users/{memberId} {
    allow read: if isMemberAuthenticated(memberId) || isGymAuthenticated();
    allow update: if isGymAuthenticated() || isMemberAuthenticated(memberId);
    allow create: if isGymPaid() && isGymAuthenticated();
}

Мы рассмотрели следующие решения:

  • Наличие идентификационного номера вУчастники документируют и ограничивают доступ к любому запросу с ID <разрешена подписка.Проблема заключается в том, что пользователь имеет доступ к документам участников и, таким образом, может изменять свои идентификаторы. </li>
  • У пользователя Firebase Cloud есть право запрашивать документы участников и удалять права записи пользователя.Это выглядит как анти-шаблон для Firestore.Поскольку мы должны реализовать облачные функции для любого изменения, которое пользователь вносит в документы участника.

1 Ответ

0 голосов
/ 20 января 2019

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

Возможно, вы захотите изучить использование request.query , чтобы ограничить общее количество документов в запросе, но для этого требуется, чтобы клиент ограничил свои собственные результаты.

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

...