如何在Firebase安全规则中写入父节点但不是子节点

问题描述:

我正在通过angularFire使用firebase。任何人都可以帮助我弄清楚如何为/用户编写新节点的最佳方式,但是会阻止任何具有不同编号的人写作?如何在Firebase安全规则中写入父节点但不是子节点

这是我不幸的安全规则。正在考虑数据是否存在以及是否存在新数据,这将涵盖此用例。它没有。

{ 
    "rules": { 
    ".read": true, 
    "users": { 
     ".write": "!data.exists() && newData.exists()", 
     "$user": { 
      ".write": "auth.uid == $user" 
     } 
    } 
    } 
} 

下面是是创造一个用户,然后更新数据库的注册方法:

register: function(obj){ 
      var authRef = new fb(fbRef); 
      var authObj = $firebaseAuth(authRef); 
      authObj.$createUser({ 
       email: obj.email, 
       password: obj.pass 
      }).then(function(userData) { 
       console.log("User " + userData.uid + " created successfully!"); 

       return authObj.$authWithPassword({ 
        email: obj.email, 
        password: obj.pass 
       }); 
      }).then(function(authData) { 
       var fbObjRef = authRef.child('users'); 
       var fbObj = $firebaseObject(fbObjRef).$loaded().then(function(data){ 
        obj.pass = null; 
        data[authData.uid] = obj; 
        data.$save(); 
       }); 
       console.log("Logged in as:", authData.uid); 
      }).catch(function(error) { 
       console.error("Error: ", error); 
      }); 
     } 

某处在线程中提到,有一个与angularFire一个错误,但该线程是从2013年开始我记得来在此用例之前,但无法找到该帖子。安全规则是最恐怖的部分。感谢您的帮助!

我很乐意学习更好的方法,但这里有一个解决方案。基本上,我能够检查用户的id是否存在,如果不存在,则允许写入。它可能不是最安全的方法,以便随时在用户/平指出我的误解或适当的验证:)

{ 
    "rules": { 

    ".read": true, 
    // ".write": true, 
    "users": { 
     ".write": "(auth !== null && !root.child('users/'+auth.uid).exists())", 
     "$user": { 
      ".write": "auth.uid == $user" 
     } 
    } 
    } 
} 
+0

你写的规则允许谁被认证写不存在任何路径任何人。这也完全是多余的。 $ user /下的'auth.uid === $ user'位可以满足您的所有需求。在帐户仪表板的规则模拟器选项卡中进行测试以进行验证。 [https://www.firebase.com/docs/security/guide/user-security.html] – Kato

+0

auth.uid === $ user'的问题在于它不允许用户在它存在之前创建他们自己的分支..即没有$ user目录,如果他们只允许写入他们自己的分支,他们如何写入父文件夹?我必须在文档中忽略这个用例,如果我的回答不合适,你会对这些规则更具体些吗? – irth

+0

为了写入/ users/$ user,您不需要/ users /存在。你有没有尝试过这个或模拟器中的例子?它应该在这里回答你的问题。如果有更多的约束或数据结构比这更复杂,请从[XY问题]的Y部分开始(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem/66378#66378)。 – Kato