У меня проблема с правилами безопасности базы данных в реальном времени. Я не могу добавить правила для конкретного узла, который запрашиваю, без получения ошибки «PERMISSION DENIED».
Поскольку я хочу проверить последнюю часть патча на наличие идентификаторов пользователей, я должен добавить правила в этом месте.
К сожалению, на данный момент я не могу легко переформатировать структуру данных, чтобы сгладить ее. Что мне здесь не хватает?
Флаттер-запрос:
chatStream = rtdb.rtdb
.child('chats')
.child('0')
.child('002')
.child('UID2_UID1')
.orderByChild('ts')
.onValue
.listen((event) {}
Структура базы данных в формате Json:
{ "chats": {
"0": {
"002": {
"UID2_UID1": {
"1705662928936": {
"message": "message"
},
"1705743447655": {
"message": "message"
}
}}}}}
Правила, которые работают:
"chats": {
"$0":{
"$002":{
".read": "auth != null",
".write": "auth != null",
}
}
},
Правила, которые не работают и возвращают ошибку (и в этом проблема — мне нужна часть пути $uid1_uid2 для проверки идентификаторов):
"chats": {
"$0":{
"$002":{
"$uid1_uid2":{
".read": "auth != null",
".write": "auth != null",
} } } },
Обновлено:
Я нашел решение, проблема была глубже в коде моего клиента, поскольку я проверял разные узлы для проверки онлайн-/локального соединения с базой данных реального времени.
Все реализации здесь должны работать правильно. Наряду со старой темой: Лучший способ управлять каналами чата в Firebase это может быть хорошим способом хранения и защиты чата — без дублирования данных.
Привет! Я просто добавил недостающий пример, ошибку и json в редактирование. К сожалению, я не смогу легко изменить структуру данных, поскольку таким образом уже сохранено большое количество данных. Я рассматриваю это как последнее средство, если не удастся установить правила в желаемом узле.
Здесь слишком много всего происходит. Именно поэтому я показал ниже пример того, что работает, на основе фрагментов, которыми вы поделились. Если это не ваша проблема, очистите свой вопрос, чтобы скрыть только проблему. Не добавляйте к нему еще больше информации, так как за ним станет сложнее следить. Покажите: 1) минимальный JSON (в виде текста JSON, без снимков экрана и схематического представления), который вы пытаетесь прочитать, 2) покажите правила, применимые к этому JSON, 3) покажите минимальный код, который не работает. --- Лучший способ обеспечить это — настроить минимальное воспроизведение, подобное тому, что я сделал ниже (например, в zapp.run).
Вы можете получить это, нажав ссылку «Экспорт JSON» в дополнительном меню (⠇) на консоли базы данных Firebase.
Я только что попробовал воспроизвести, но у меня все работает как положено.
Моя установка ниже.
Код:
await FirebaseAuth.instance.signInAnonymously();
final db = FirebaseDatabase.instance.ref('78358207');
final uid = FirebaseAuth.instance.currentUser!.uid;
print(uid);
final roomID = uid+"_"+"otheruid";
final roomRef = db.child(roomID);
roomRef.onValue.listen((event) {
print("Room ${roomID} has value ${event.snapshot.value}");
});
roomRef.set(DateTime.now().millisecondsSinceEpoch);
Правила:
{
"rules": {
"78358207": {
"$roomID":{
".write": "auth != null && $roomID.contains(auth.uid)",
".read": "auth != null && $roomID.contains(auth.uid)",
}
},
...
78358207
в пути — это идентификатор вашего вопроса, так что ничего магического. Кроме того, все значения находятся в самом коде. Каждый раз, когда я выполняю этот код, операция записи завершается успешно, и прослушиватель значения печатает значение.
Вы можете выполнить эту репродукцию здесь: https://zapp.run/edit/rtdb-access-key-taining-uid-zl4e06oil4f0
Я обнаружил, что проблема была глубже в коде моего приложения. Это рабочее решение этой проблемы — независимо от количества узлов. Спасибо за помощь, Фрэнк! Я искренне ценю всю информацию, которую мне удалось собрать и использовать из этого и других ваших ответов на протяжении многих лет!
Если ваш код действительно попытается прочитать узел одной комнаты, к которому у него есть доступ, ваш код будет работать. Так что, скорее всего, где-то есть несоответствие, но нам сложно сказать, где оно связано, из-за всех используемых вами переменных. --- Можете ли вы: 1) упростить структуру данных, чтобы использовать только
/rooms/$roomID
? 2) Включите этот JSON в качестве текста в вопрос. 3) Покажите обновленный код для этой структуры без каких-либо необъявленных переменных (то есть только жестко запрограммированные значения и переменные, где мы можем видеть инициализацию). 4) распечатать сообщение об ошибке, а затем показать нам код и полную трассировку сообщения + стека?