# #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. Рад, что смог помочь.