Как узел $ uid работает с правилами базы данных firebase-realtime-database? - PullRequest
2 голосов
/ 04 июля 2019

Я работаю над базой данных firebase-realtime-database на ionic, я немного запутался в том, как «читать» и «писать» внутри узла $ uid. Который я в настоящее время имею дело с отказом в доступе.

узел выглядит так

rules {
"info": {     
   "$uid": {
      ".read": true,
      ".write": "$uid === auth.uid"
   }     
 }
}

пока моя база данных json выглядит так


{
  info: {
     01: {
     name:jay
     age:16
     }
  }
}


Я немного запутался, какие шаги предпринять, чтобы получить доступ к данным внутри узла $ uid. Я попытался обновить свой узел базы данных JSON до этого.


{
  info: {
    f3de4734-8fb2-42bd-971d-8e693f8aab3b: {  // auth.uid of dummy@gmail.com
            01: {
            name:jay
            age:16
            }
    }
  }
}

и моя директория пути "getafdData ()" к "'info /' + getuser".

вышеприведенные обновления работают только в том случае, если «getuser» является владельцем файла или узла, в котором хранятся данные, однако я хочу, чтобы он также читался другими аутентифицированными пользователями, что я не могу понять с помощью $ uid.

Я уже аутентифицировал вход в систему с помощью функции signInWithEmailAndPassword () firebase

это код, который я использую для аутентификации

 try {
      var r = await this.fAuth.auth.signInWithEmailAndPassword(
        "dummy@gmail.com",
        "123456"
      );
      if (r) {
        console.log("Successfully logged in!");
        await this.getafdData(); \\\ get the data when login

      }

    } catch (err) {
      console.error(err);
    }
async getafdData(){

var firebaseRef = this.afd.database.ref();
let data = await new Promise(function(resolve,reject){
   return firebaseRef.child('info/')
      .on("child_added", function(snapshot) {
         console.log(snapshot.val());
         //resolve(data);


       }, function(err) {
         console.log(err);
         reject(err);
       })
    }); 
return data;
}

Можете ли вы посоветовать, что я делаю не так? или, вернее, правильные шаги, которые я должен сделать для доступа к узлу $ uid?

1 Ответ

2 голосов
/ 04 июля 2019

Правило ".read": true позволяет любому пользователю читать данные из /info/$uid , если они знают UID пользователя, данные которого они хотят прочитать . Однако в вашем коде вы присоединяете слушателя к /info и , никто не имеет разрешения на чтение на этом узле, поэтому чтение отклонено.

Если вы хотите, чтобы каждый мог прочитать все пользовательские узлы за один раз, вы должны переместить правило ".read": true, на уровень /info ваших правил:

{
  "rules": {
    "info": {     
      ".read": true,
      "$uid": {
        ".write": "$uid === auth.uid"
    }     
  }
}

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

{
  "rules": {
    "info": {     
      ".read": "auth != null",
      "$uid": {
        ".write": "$uid === auth.uid"
    }     
  }
}
...