#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;
}