【问题标题】:How does $uid node works on firebase-realtime-database rules?$uid 节点如何处理 firebase-realtime-database 规则?
【发布时间】:2019-11-14 17:39:23
【问题描述】:

我正在研究 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 节点我应该采取正确的步骤?

【问题讨论】:

  • getafdData 是做什么的?如果您编辑您的问题以包含该方法的代码,这可能是最好的。你有什么问题?有错误信息吗?
  • 感谢 btw 发现我的错误,我已经编辑了我的问题。

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


【解决方案1】:

".read": true 规则允许任何用户从/info/$uid 读取数据如果他们知道要读取其数据的用户的 UID。但是,在您的代码中,您将侦听器附加到 /info 并且 nobody 对该节点具有读取权限,因此读取被拒绝。

如果您希望每个人都能一口气读取所有用户节点,则应将 ".read": true, 规则移至规则的 /info 级别:

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

其实,既然你说要允许其他认证用户读取用户信息,那应该是:

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

【讨论】:

  • 谢谢@Frank,关注您对其他与firebase相关的问题的大部分回答。你打了我想要的答案。我还有一个问题,是否需要在数据库节点上添加User UID?为了验证语句 $uid === $auth.uid?
  • 而且 IF 这是必要的,因此我不能展平我的节点对吗?问题是,在用户 UID 下面也是一个唯一标识。展平它,会使 the 其他节点上没有用户 UID,我无法在写入状态时验证语句 $uid === auth.uid
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 2020-03-25
  • 2021-12-18
  • 2021-03-02
相关资源
最近更新 更多