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