我在Web应用程序中使用Firebase Authentification,我使用电话号码验证作为登录应用程序的选项。
function saveUser(fname) {
var user = firebase.auth().currentUser;
var newUserRef = firebase.database().ref('users/' + user.uid);
newUserRef.set({
fname: fname
});
}
根据以下数据库规则:
{
"rules" : {
".read" : false,
".write" : false,
// only authenticated users can write
"users": {
".read": "auth != null",
"$user_id": {
"fname": {
".read": "auth != null",
".write": "auth != null",
".validate": "newData.isString() && newData.val().matches(/^[A-Z]{3,}$/)"
},
}
}
}
}
然而,我一直收到错误:
FIREBASE警告:设置为/ users / ypGXpJRM1wdMOuOMf8F7quLnJ073失败: PERMISSION_DENIED
有没有办法在不改变规则的情况下避免此错误?
答案 0 :(得分:3)
您的规则允许撰写的第一个级别位于/users/$uid/fname
。但是您的代码尝试写入/users/$uid
。由于您没有写权限,因此数据库拒绝写操作。
您有两种方法可以解决此问题:允许写入/users/$uid
或写入/users/$uid/fname
。
/users/$uid
要允许写入/users/$uid
,请将规则更改为:
"users": {
".read": "auth != null",
"$user_id": {
".write": "auth != null",
"fname": {
".read": "auth != null",
事实上,您可能希望确保用户只能编写自己的节点,您可以使用以下节点:
"users": {
".read": "auth != null",
"$user_id": {
".write": "auth.uid === $uid",
"fname": {
".read": "auth != null",
/users/$uid/fname
您当前的代码尝试写入您没有权限的地方。由于您只编写fname
,因此您也可以写入该特定位置以消除错误:
var newUserRef = firebase.database().ref('users/' + user.uid);
newUserRef.child('fname').set(fname);
鉴于数据结构,我可能会去修改安全规则。
答案 1 :(得分:0)
这些规则阻止了所有访问:
".read" : false,
".write" : false,
您可以在Firebase数据库规则模拟器工具中轻松测试数据库安全规则。