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

时间:2015-10-20 04:42:28

标签: angularjs firebase angularfire firebase-security

我通过angularFire使用firebase。任何人都可以帮我弄清楚如何向/ users写一个新节点的最佳方法,然后阻止任何具有不同id的人写作?

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

{
  "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年开始的。我记得以前遇到过这个用例但找不到帖子。安全规则是最可怕的部分。谢谢你的帮助!

1 个答案:

答案 0 :(得分:-2)

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

{
  "rules": {

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