Правила безопасности Firestore: запрос.запрос.ограничение не работает со сложным запросом

#firebase #google-cloud-firestore #firebase-security

#firebase #google-облако-firestore #firebase-безопасность

Вопрос:

  allow list: if request.query.limit <= 15;
 

Это правило просто игнорируется при использовании с составным запросом.

 firestore().collection('orders').where('customerId', '==', uid)
      .where('orderStatusCode', 'in', [1, 2, 3])
      .limit(100)
      .get()....
 

Правило безопасности:

   match /orders/{order} {
  allow list: if request.query.limit <= 15;

  allow read: if request.auth.uid == resource.data.customerId;
  allow create: if request.auth != null;
  allow update: if request.auth.uid == resource.data.customerId;
  allow delete: if false;
}
 

Комментарии:

1. Можете ли вы опубликовать пример запроса, который игнорирует правило? Кроме того, наличие всего правила безопасности может быть полезно для устранения этой проблемы.

2. В чем здесь проблема? У вас есть limit <= 15 и ваш запрос есть limit(10) , поэтому вы должны получать данные. Вы не получаете данные?

3. Понял. Спасибо. Сейчас я напишу ответ.

4. @dshukertjr Я получаю данные, даже если в запросе установлено ограничение 100.

5. Я обновил свой ответ

Ответ №1:

Правила безопасности Firestore разрешат операцию, если какое-либо из правил безопасности разрешает операцию.

В вашем случае вы разрешаете read доступ в строке после правила списка. read представляет собой комбинацию get и list . get предназначен для конкретного запроса к документу и list для запроса к коллекции. Несмотря list на то, что правило было отклонено, read правило проходило, поэтому ваш запрос получал данные.

Вы можете обновить свое правило безопасности следующим образом, чтобы оно работало:

 match /orders/{order} {
  allow list: if request.query.limit <= 15;

  allow get: if request.auth.uid == resource.data.customerId;
  allow create: if request.auth != null;
  allow update: if request.auth.uid == resource.data.customerId;
  allow delete: if false;
}
 

Или, если вы хотите сделать данные доступными для пользователей, где auth.uid == customerId это было бы так:

 match /orders/{order} {
  allow list: if request.query.limit <= 15 
  amp;amp; request.auth.uid == resource.data.customerId;

  allow get: if request.auth.uid == resource.data.customerId;
  allow create: if request.auth != null;
  allow update: if request.auth.uid == resource.data.customerId;
  allow delete: if false;
}