我通过angularFire使用firebase。谁能帮我弄清楚如何最好的方式来写一个新的节点/用户,但然后防止任何人与不同的id写?
这是我不幸的安全规则。我在想,如果数据不存在,而有新的数据存在,那将涵盖这个用例。它不是。
{
"rules": {
".read": true,
"users": {
".write": "!data.exists() && newData.exists()",
"$user": {
".write": "auth.uid == $user"
}
}
}
}
下面是register方法,它创建一个用户,然后更新数据库:
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有一个bug,但那个线程是从2013年开始的。我记得以前遇到过这个用例,但找不到帖子。安全规则是最可怕的部分。谢谢你的帮助!
我愿意学习更好的方法,但这里有一个解决方案。基本上,我能够检查用户的id是否存在,如果不存在则允许写入。这可能不是最安全的方法,所以请随意指出我的误解或适当的验证:)
{
"rules": {
".read": true,
// ".write": true,
"users": {
".write": "(auth !== null && !root.child('users/'+auth.uid).exists())",
"$user": {
".write": "auth.uid == $user"
}
}
}
}