Firebase安全规则和身份验证

时间:2018-08-13 18:37:29

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

这是用例:

  1. 任何人都可以注册使用该应用程序。身份验证由Firebase身份验证处理。

  2. 注册用户只能读写自己的详细信息。对数据库的访问由Firebase安全规则管理。例如:

    {
      "rules": {      
             ".read" : "root.child('Admins').hasChild(auth.uid)",
             ".write" : "root.child('Admins').hasChild(auth.uid)",
      "Companies": {
           "$company" : {
               ".read" : "data.child('firebaseuid').val() === auth.uid", 
               ".write" : "data.child('firebaseuid').val() === auth.uid",
               "firebaseuid" : {
                                ".write" : ???? ,   
                                ".read" : ????,
               },
               "details" : {
                                ".read" :  "data.parent().child('firebaseuid').val() === auth.uid", 
                               ".write": "data.parent().child('firebaseuid').val() === auth.uid",  
               },
               },
       },
    }  
    

问题:“ firebaseui”的适当安全规则是什么?

  1. 很显然,将读写属性设置为true不会。那是一个开放的数据库。

    "firebaseuid" : {
      ".write" : true ,   
      ".read" : true,
    },
    
  2. 同样,:“ auth!== null”不起作用,因为它将允许任何注册用户读取/写入所有人的信息。

    "firebaseuid" : {
      ".write" :"auth !== null" ,   
      ".read" :"auth !== null",
    },
    
  3. 将规则设置为仅允许注册用户读取/写入几乎可以执行。

    "firebaseuid" : {
      ".read" :  "data.parent().child('firebaseuid').val() === auth.uid", 
      ".write": "data.parent().child('firebaseuid').val() === auth.uid",  
    

    }

几乎,因为这会遇到“首次写入”问题。也就是说,用户将无法在注册时初始化firebase uid(“ firebaseuid”),因为在第一种情况下,firebaseuid字段为null,从而导致安全规则返回false。

  1. 一个人可以在安全规则中添加一个firebase验证器,以便用户只有在该字段为空时才可以写入“ firebaseuid”。如果只有一个注册用户,这将很好地工作。但是,假设每个组织有多个管理员?在这种情况下,此解决方案将失败。

  2. 一个人可能想编写注册时触发的Firebase Cloud函数,但是Firebase用户类包含的信息不足。注册时,唯一可用的信息是通过电子邮件发送密码。

  3. 一个人可以编写由数据库创建或http put触发的更复杂的Cloud函数,但是我能想到的每种方法都有一个安全漏洞。

我意识到这肯定是一个非常普遍的问题,因此必须有一个简单的答案。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

通常,您将只允许用户将firebaseuid设置为自己的UID,并且前提是该值当前没有值。所以:

"firebaseuid" : {
  ".write" : "!data.exists() && newData.val() === auth.uid"
},