Правила Firebase/безопасность в группе коллекционирования используйте, если состояние

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

Вопрос:

У меня проблема с правилами пожарной базы.

В данный момент я пытаюсь установить новые правила для большей безопасности в своей БД.

Моя проблема в том, что в моем коде flutter я использую группу коллекций, и я не знаю, как я могу указать правила.

В правилах firebase я создал этот код:

  • doc -> product_id (содержит случайное число и идентификатор пользователя)
  • путь -> путь к product_details
 //check product details
match /{path=**}/product_details/{doc}{
      
//check the user own the product -> is it -> he has all rules
allow read : if(doc.split('_')[2] == request.auth.uid);
      
//check the user own the product -> is not -> only can only read
allow write : if(doc.split('_')[2] != request.auth.uid);
      
//coming soon -> admin rules -> write/delete/read/update
}
 

Чтобы проверить, что пользователь находится в своем собственном продукте, я разделил product_id.
Идентификатор продукта также содержит идентификатор пользователя.

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

Продукты от других пользователей могут только считываться.

Это просто пример.

Если я установлю в коде выше состояние «разрешить чтение», мое приложение будет работать нормально.

Но я меняю состояние (например, с состоянием if), я получил ошибку в своем приложении.

В firebase debug мой код работает нормально.

В flutter группа коллекций выглядит следующим образом::

 //collection group all collection with 'product_images'
    Query<Map<String, dynamic>>  collectionGroupImage = FirebaseFirestore.instance.collectionGroup('product_images');

//get data from collection group
var query_product_images = await collectionGroupImage.get();
 

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

Моя база данных: Путь: /пользователь/идентификатор пользователя/данные/product_data/product_details/product_id/параметр(цена,описание…)

введите описание изображения здесь

Я добавляю весь продукт от одного пользователя в пользователя (см. Путь выше)

Моя проблема в том, что если я хочу показать все продукты в своем приложении, мне нужны идентификаторы всех продуктов. Чтобы решить эту проблему, я создаю группу коллекционирования в своих «product_details». Теперь я могу получить все ценности в своих продуктах. До сих пор его работа.

Если у вас возникнут какие-либо вопросы, не стесняйтесь задавать их мне.

У кого-нибудь есть идея, как я могу установить состояние if в коде. Много раз

Ответ №1:

Поскольку вы хотите, чтобы пользователь мог видеть все данные product_details: Используйте это правило для своей группы коллекций

 match /{path=**}/product_details/{docId}{
  allow read: if true;
  // allow read: if (request.auth != null); use this line if you want to 
  // allow only logged in users.
}
 

Затем, чтобы запретить пользователю изменять данные других пользователей, используйте что-то вроде этого

 function isLoggedIn() {
  return request.auth != null;
}
function isOwner(detailsId) {
  return isLoggedIn() amp;amp; detailsId.split('_')[2] == request.auth.uid;
}
match /product_details/{detailsId} {
  allow update, delete, create: if isOwner(detailsId);
}
 

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

1. Привет, Питер, спасибо за твой ответ. Мне нужна группа коллекционирования, чтобы показать все товары всех пользователей. В вашем примере (я думаю) я выбираю только свои продукты. Это не то, что я хочу делать. В своем вопросе я обновил свою базу данных, чтобы лучше объяснить свою проблему.

2. Если вы хотите, чтобы в вашей группе коллекционирования отображались товары от всех пользователей, то ваши правила firestore должны быть: совпадать /{путь=**}/product_details/{docId}{разрешить чтение: если верно;} или если вы хотите, чтобы только зарегистрированные пользователи могли читать все данные о продуктах, ваши правила firestore должны быть: совпадать /{путь=**}/product_details/{docId}{разрешить чтение: если (запрос. auth != null);}

3. Привет, Питер, спасибо за твой ответ. Это работает. Но как я могу проверить, является ли пользователь владельцем продукта? Для этого мне нужен идентификатор пользователя. Но я не знаю, как я могу получить его из ‘path=**’? Вот почему я разделил номер продукта. Номер продукта содержит идентификатор id_randomNumber_UserID. Но если я разделюсь, это не сработает. В режиме отладки firebase работает? У тебя есть идея? Много раз

4. Все работает нормально. Многие Thx (:. Ты спасаешь мне жизнь

5. Рад, что смог помочь.