$ uid节点如何在firebase-realtime-database规则上工作?

时间:2019-07-04 03:04:52

标签: javascript firebase firebase-realtime-database firebase-authentication firebase-security-rules

我正在处理基于ionic的firebase-realtime-database,我对如何在$ 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无法理解。

我已经通过firebase使用“ signInWithEmailAndPassword()”函数对登录进行身份验证

这是我用来验证的代码

 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 个答案:

答案 0 :(得分:2)

".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"
    }     
  }
}