Настройка данных / правил базы данных Firebase, чтобы публикация пользователя была общедоступной - PullRequest
0 голосов
/ 07 августа 2020

Я создаю приложение с учебными карточками, используя базу данных Firebase в реальном времени, и хочу, чтобы пользователь мог публично делиться колодой. Это означает, что любой пользователь может видеть колоду создателя, но только создатель может редактировать. У меня проблемы с настройкой правил / структуры данных Firebase, которые позволили бы этому случиться.

Прямо сейчас это работает так: любая колода publi c помещается в узел publicDecks, получая свой собственный уникальный идентификатор со следующей структурой:

-publicDecks
   |
   +jiEFJfehihxi (unique deck id)
     |+cards 
     |-deckName:"spanish vocab"
     |-uid:"iawojefiaofiojfweaf" (creator's uid)  

В моих правилах я хочу, чтобы любой аутентифицированный пользователь имел возможность sh новой колоды для этого узла. Но если пользователь пытается обновить существующую колоду, я хочу, чтобы правила проверяли, что auth.uid пользователя соответствует свойству uid, прикрепленному к существующей колоде.

Я установил свои правила следующим образом:

"publicDecks": {
        ".read": "auth != null", 
      "$deck":{
        ".write": "auth!=null && root.child('publicDecks').child($deck).child('uid').val() == auth.uid"
      }

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

1 Ответ

0 голосов
/ 07 августа 2020

Поскольку вы просматриваете колоду из root, вы получаете данные в том виде, в каком они в настоящее время существуют в базе данных. А это значит, что вы не получите колоду при ее первом создании.

Но вам все равно не нужно искать текущую колоду в root. Вместо этого вы можете начать с data или newData, причем последний будет иметь данные, которые будут существовать после текущей операции записи (если она разрешена).

Таким образом, это будет примерно так:

"publicDecks": {
  ".read": "auth != null", 
  "$deck":{
    ".write": "newData.child('uid').val() == auth.uid"
  }
}

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

"$deck":{
  ".write": "(!data.child('uid').exists() && newData.child('uid').val() == auth.uid)
             || data.child('uid').val() == newData.child('uid').val()"
}

Я бы обычно перемещал эти правила в дочерний элемент uid, чтобы сделать их немного короче:

"$deck":{
  "uid": {
    ".write": "(!data.exists() && newData.val() == auth.uid)
               || data.val() == newData.val()"
}
...