Предоставьте пользователю доступ к своим данным в firebase - PullRequest
0 голосов
/ 03 июля 2018

У меня есть пользователь, связанный с каждой информацией,

data model pic

и правило определяет как ниже-

{
  "rules": {
    ".read": false,
    ".write": false,
    "expenses": {
      ".read": "auth.uid === data.child('userId').val()",
      ".write": "auth.uid === data.child('userId').val()"
    },
    "categories": {
        ".read": "auth != null",
        ".write": "auth != null"
    }
  }
}

У меня есть требование, чтобы пользователь мог только читать данные, связанные с его идентификатором пользователя.

функция для получения данных-

getExpense():AngularFireList<ExpenseData>{
   if (!this.userId) return;
   this.expenses = this.db.list(`expenses`);
   return this.expenses
}



getCategory():AngularFireList<CategoryData>{
   if (!this.userId) return;
   this.categories = this.db.list('categories');
   return this.categories;
}

Ошибка:

Ошибка: разрешение_данных в / расходы: у клиента нет прав доступа к нужным данным.

1 Ответ

0 голосов
/ 03 июля 2018

Похоже, вы пытаетесь читать с /expenses, но это условие для получения доступа к /expenses:

".read": "auth.uid === data.child('userId').val()",

Поскольку /expenses/userId отсутствует, никто не имеет доступа к /expenses. Если вы добавите /expenses/userId с UID, то пользователь с этим UID будет иметь доступ ко всем /expenses, а не только к своим.

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

Уже через несколько месяцев возможно реализовать ваш сценарий. Но вам нужно будет сделать это в два этапа, которые идут рука об руку:

  1. Из вашего кода убедитесь, что запрашиваете только дочерние узлы, которые разрешены.
  2. Используйте ваши правила для проверки того, что запрос обращается только к разрешенным данным.

См. документацию по правилам на основе запросов . Оттуда:

код:

db.ref("baskets").orderByChild("owner")
                 .equalTo(auth.currentUser.uid)
                 .on("value", cb)     

Правила:

"baskets": {
  ".read": "auth.uid != null &&
            query.orderByChild == 'owner' &&
            query.equalTo == auth.uid" // restrict basket access to owner of basket
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...