Как обеспечить безопасный доступ для пользователя и администратора в базе данных Firebase? - PullRequest
0 голосов
/ 28 июня 2018

Я использую Redux-Saga в качестве промежуточного программного обеспечения. Я передаю параметр с помощью запроса в базу данных Firebase, но не могу получить к нему доступ в конце базы данных.

Запрос :::

database.ref("workouts")
.child(userId)
.once("value")
.then(snapshot => {
 console.log("onSuccess:", snapshot.ref, snapshot.val());
 resolve(snapshot.val());
 })
.catch(function(error) {
 console.log("Error fetching document: ", error);
 reject(error);
 });

UserId - это значение, которое я извлекаю из localStorage и отправляю в базу данных с помощью запроса, используя ".child (userId)"

Запрос ::: (для администратора)

database.ref("workouts")
.once("value")
.then(snapshot => {
 console.log("onSuccess:", snapshot.ref, snapshot.val());
 resolve(snapshot.val());
 })
.catch(function(error) {
 console.log("Error fetching document: ", error);
 reject(error);
 });

Правила в базе данных ::::

{
"rules": {
         "workouts": {
          // grants write access to the owner of this user account || the user role is equal to  admin
          // grants read access to the owner of this user account || the user role is equal to  admin
".read":"(data.exists() && auth.uid != null && data.child(auth.uid).exists()) ||root.child('users').child(auth.uid).child('role').val() == 'admin'",
".write":"data.exists() ||root.child('users').child(auth.uid).child('role').val() == 'admin'"
                     }
         }
}

Я пытался получить доступ к значению, используя методы [query.equalTo] и [data.child (auth.uid) .val ()], но не получил никакого результата.

JSON для тренировок :::::

"workouts" : {
"6OiasllKwVSjjRfrCarMAjhkKAH2" : {
  "-LD3nNIKw9Yk3HcoAL0-" : {
         "exercises" : [ {
          "muscleGroup" : "Chest",
          "name" : "Incline Dumbbell Fly",
          "sets" : [ 0, 0, 0, 0, 0 ],
          "type" : "reps"
        } ],
        "name" : "Force Set",
        "reps" : [ "5", "5", "5", "5", "5" ],
        "type" : "Weights"
       }]
    },
    "workoutName" : "My Test workout"
  }

JSON для пользователей :::::

 "users" : {
     "6OiasllKwVSjjRfrCarMAjhkKAH2" : {
     "email" : "testuser@gmail.com",
     "role" : "user",
     "uid" : "6OiasllKwVSjjRfrCarMAjhkKAH2"
       }
     }

Любая помощь высоко ценится.

Большое спасибо заранее.

Edit :::: Добавлен запрос для администратора. Я хочу получить все доступные данные в коллекции в случае администратора.

1 Ответ

0 голосов
/ 28 июня 2018

Я думаю, что вижу, что происходит не так. В вашем JSON, кажется, есть все тренировки для пользователя, под /workouts/$uid. Ваши правила пытаются предоставить пользователю доступ ко всем /workouts, а не только к их собственным.

Решение состоит в том, чтобы переместить правило на один уровень ниже в дерево:

{
  "rules": {
    "workouts": {
      // grants access to the owner of this user account || the user role is equal to  admin
      "$uid": {
        ".read":"auth.uid == $uid || root.child('users').child(auth.uid).child('role').val() == 'admin'",
      },
      ".write":"data.exists() || root.child('users').child(auth.uid).child('role').val() == 'admin'"
    }
  }
}

Также см. Документацию по защите пользовательских данных , в которой есть хороший простой пример этого.

Обновление : если вы хотите, чтобы администратор мог читать /workouts, а каждый пользователь мог читать свои собственные тренировки под /workouts/$uid, то вам нужны следующие правила:

{
  "rules": {
    "workouts": {
      // grants access to the owner of this user account
      "$uid": {
        "read": "auth.uid == $uid",
      },
      // grants access to the admin
      ".read": "root.child('users').child(auth.uid).child('role').val() == 'admin'",
      ".write": "data.exists() || root.child('users').child(auth.uid).child('role').val() == 'admin'"
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...