我正在尝试确保firebase数据库的安全性。我的问题是限制用户配置文件,以便只有用户可以编辑他/她自己的节点。当用户注册时,我创建了一个firebase auth用户,并立即通过电子邮件将此用户添加到我的数据库中;但是,在尝试向数据库添加新用户时,我收到权限被拒绝错误。
我感到困惑,因为我在firebase模拟器中的模拟运行顺利;但是,我的代码没有按预期工作。在调试中,我尝试在写入数据库时打印当前的uid,并将其与用户的authID进行比较,然后匹配。在另一个步骤中,我将规则简化为:auth != null
,它也失败了。这让我相信用户没有及时进行身份验证,但如果是这样的话,当前uid的打印将无效。
以下是我的规则:
"users" : {
"$user_id": {
".read":"true",
".write":"auth != null",
".validate": "newData.exists()",
"isAdmin": {
".validate":"false"
},
"email": {
".validate":"newData.val().matches(/^.+@.+\\..+$/)"
}
}
}
以下是我的chrome检查器控制台的图片,用于显示错误之前的错误以及uid的打印:
以下是我用来编写的代码:
var firstName = $(".signUpForm #firstName").val();
var lastName = $(".signUpForm #lastName").val();
var emailInput = $("#emailInput").val();
var password = $("#passwordInput").val();
var passwordConfirm = $(".signUpForm #passwordConfirmInput").val();
const promise = firebase.auth().createUserWithEmailAndPassword(emailInput, password).then(function(user) {
console.log(user.uid);
console.log(firebase.auth().currentUser.uid);
// user signed in
var usersRef = firebase.database().ref('users');
var uid = firebase.auth().currentUser.uid;
usersRef.child(uid).set({
email: emailInput
}).catch(function(error) {
displayErrorMessage(error.code);
}).then(function() {
//window.location.reload(true);
})
// $(".logInMessage").html('SignedUp!');
// $(".logInMessage").css("color", "green");
}).catch(function(error) {
var errorCode = error.code;
var errorMessage = error.message;
if (errorCode === 'auth/wrong-password') {
$(".logInMessage").html('Wrong password.');
$(".logInMessage").css("color", "red");
} else {
$(".logInMessage").css("color", "red");
$(".logInMessage").html(errorMessage);
}
console.log(error);
});
答案 0 :(得分:0)
限制用户以便他们只能编辑自己的节点可以通过以下方式完成:
".write": "auth != null && auth.uid == $user_id"
对于写访问的其他问题,您可能需要在模拟器中进行试验,或者尝试删除一些规则并缩小范围,直到您可以隔离违规行。