Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在多次更新时处理firebase数据库安全规则?_Javascript_Firebase_Firebase Realtime Database_Firebase Security - Fatal编程技术网

Javascript 如何在多次更新时处理firebase数据库安全规则?

Javascript 如何在多次更新时处理firebase数据库安全规则?,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,我目前正在努力定义数据库安全规则。 在创建用户配置文件期间,我为数据库创建了一个更新对象,格式如下: firebase.auth().onAuthStateChanged(firebaseUser => { const currentkey= firebaseUser.uid; var userCreateObject = {}; userCreateObject['users/' + currentkey + '/use

我目前正在努力定义数据库安全规则。 在创建用户配置文件期间,我为数据库创建了一个更新对象,格式如下:

firebase.auth().onAuthStateChanged(firebaseUser => {
          const currentkey= firebaseUser.uid;
            var userCreateObject = {};
            userCreateObject['users/' + currentkey + '/username'] = username;
            userCreateObject['users/' + currentkey + '/email'] = email;
            userCreateObject['users/' + currentkey + '/birthdate'] = birthdate;
            userCreateObject['usernames/' + username] = currentkey;
            userCreateObject['followed/' + currentkey + '/MAINITEM/item'] = item;
            userCreateObject['filters/' + currentkey + '/MAINITEM/item'] = item;
            //Start account for the user
            firebase.database().ref().update(userCreateObject).then(function() {...})
...
});
但是,以下安全规则会导致操作失败:

{
  "rules": {
    "filters": {
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
      }
    },
    "followed": {
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
      }
    },
    "usernames": {
        ".read": "true",
        ".write": "auth.uid != null && (!data.exists())"
    },
    "users": {
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
      }
    }
  }
}
即使只是测试更新的“用户”部分,权限也会被拒绝。 那么,我的提示是,定义规则的正确方式是什么,这样他们就可以接受指定元素的创建,即使该元素以前不存在,但以后会接受用户以更新的形式进行的修改

还有,有没有具体的方法来测试这类规则?在第一次定义它们时,我以以下形式进行了模拟:

firebase.auth().onAuthStateChanged(firebaseUser => {
          const currentkey= firebaseUser.uid;
            var userCreateObject = {};
            userCreateObject['users/' + currentkey + '/username'] = username;
            userCreateObject['users/' + currentkey + '/email'] = email;
            userCreateObject['users/' + currentkey + '/birthdate'] = birthdate;
            userCreateObject['usernames/' + username] = currentkey;
            userCreateObject['followed/' + currentkey + '/MAINITEM/item'] = item;
            userCreateObject['filters/' + currentkey + '/MAINITEM/item'] = item;
            //Start account for the user
            firebase.database().ref().update(userCreateObject).then(function() {...})
...
});
/用户/someuidImadeup

{
  "username": "username",
  "email": "email",
  "birthdate": "birthdate"
 }
它工作正常。及

/使用者

{ "someuidImadeup":
 {
  "username": "username",
  "email": "email",
  "birthdate": "birthdate"
 }
}

那失败了。因此,我假设更新是以这种形式处理的。

您的规则中缺少了一个用于/用户名的通配符

如果没有额外的级别,规则将检查是否存在任何用户名,这可能永远不会是真的

仅供参考:为了获得额外的安全性,您可能希望检查用户是否只能为用户名编写自己的UID,具体如下:

".write": "auth.uid != null && !data.exists() && newData.val() == auth.uid"

非常感谢你,弗兰克。你似乎完全正确。关于安全方面,我正在着手,但我不想让问题因附加规则而变得更加复杂,幸运的是,这方面还没有给我带来太多麻烦…