Правила безопасности базы данных Firebase Realtime не работают в выбранном узле

У меня проблема с правилами безопасности базы данных в реальном времени. Я не могу добавить правила для конкретного узла, который запрашиваю, без получения ошибки «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 это может быть хорошим способом хранения и защиты чата — без дублирования данных.

Если ваш код действительно попытается прочитать узел одной комнаты, к которому у него есть доступ, ваш код будет работать. Так что, скорее всего, где-то есть несоответствие, но нам сложно сказать, где оно связано, из-за всех используемых вами переменных. --- Можете ли вы: 1) упростить структуру данных, чтобы использовать только /rooms/$roomID? 2) Включите этот JSON в качестве текста в вопрос. 3) Покажите обновленный код для этой структуры без каких-либо необъявленных переменных (то есть только жестко запрограммированные значения и переменные, где мы можем видеть инициализацию). 4) распечатать сообщение об ошибке, а затем показать нам код и полную трассировку сообщения + стека?

Frank van Puffelen 20.04.2024 16:10

Привет! Я просто добавил недостающий пример, ошибку и json в редактирование. К сожалению, я не смогу легко изменить структуру данных, поскольку таким образом уже сохранено большое количество данных. Я рассматриваю это как последнее средство, если не удастся установить правила в желаемом узле.

happypikatchu 21.04.2024 10:55

Здесь слишком много всего происходит. Именно поэтому я показал ниже пример того, что работает, на основе фрагментов, которыми вы поделились. Если это не ваша проблема, очистите свой вопрос, чтобы скрыть только проблему. Не добавляйте к нему еще больше информации, так как за ним станет сложнее следить. Покажите: 1) минимальный JSON (в виде текста JSON, без снимков экрана и схематического представления), который вы пытаетесь прочитать, 2) покажите правила, применимые к этому JSON, 3) покажите минимальный код, который не работает. --- Лучший способ обеспечить это — настроить минимальное воспроизведение, подобное тому, что я сделал ниже (например, в zapp.run).

Frank van Puffelen 21.04.2024 16:56

Вы можете получить это, нажав ссылку «Экспорт JSON» в дополнительном меню (⠇) на консоли базы данных Firebase.

Frank van Puffelen 21.04.2024 16:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Моя установка ниже.

Код:

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

Я обнаружил, что проблема была глубже в коде моего приложения. Это рабочее решение этой проблемы — независимо от количества узлов. Спасибо за помощь, Фрэнк! Я искренне ценю всю информацию, которую мне удалось собрать и использовать из этого и других ваших ответов на протяжении многих лет!

happypikatchu 21.04.2024 20:07

Другие вопросы по теме