Получение access_denied в / items: у клиента нет прав доступа к нужным данным - PullRequest
0 голосов
/ 06 мая 2019

Я определяю правило firebase для чтения данных по userId. userId - это флаг для всех данных, созданных пользователем, который, конечно же, представляет собой пользовательский uid.

ее правило ниже:

{
    "rules": {
      "items": {
        "$itemId": {
         ".read": "auth !== null && root.child('items/$itemId/userId').val() === auth.uid"
        }
      }
    }
}

И я обращаюсь к данным на стороне клиента, вот так:

firebase.database().ref(`/items`)
    .once('value')
    .then(snapshot => {
      const places = []
      const data = snapshot.val();
      for (let key in data) {
        places.push({
          ...data[key],
          key: key
        });
      }
    })

Я хочу получить доступ к данным для владельца на основе его флага userId для каждого элемента.

Пример структуры данных ниже:

1 Ответ

1 голос
/ 06 мая 2019

Согласно документации Firebase правила не являются фильтрами . Однако в прошлом году (2018) были введены правила запросов , я думаю, что сообщение в блоге лучше, чем документы для понимания этого.

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

{
    "rules": {
      "items": {
         ".read": "query.orderByChild == 'userId' && query.equalTo == auth.uid"
      }
    }
}

Затем вы должны изменить свой запрос:

firebase.database().ref(`/items`).orderByChild('userId').equalsTo(userId)...

И, наконец, кажется, что ваша структура базы данных может указывать на другие потребности:

  • Если вы хотите, чтобы ваши данные были доступны только для пользователя, который их создал, а также для администратора, который может видеть все, то лучшим решением будет денормализация ваших данных. Ваша структура данных будет:
user_items: {
    uid1: {
          key1:{//full object here}
     }
},
items: {
    key1:{//partial item here, just name and photo, think on a list}
},
admins:{
    uid1:true
}

Здесь проблема администрирования решается с помощью узла администратора, который может использоваться вместе с пользовательскими утверждениями и Firebase Functions .

  • Так как есть мест word , возможно, вам нужно использовать что-то еще, например geofire для локаций
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...