Javascript Firebase安全规则数据.exists()不工作
在这篇文章之后,我创建了一个简单的安全规则和云函数,可以调用它来查看用户名是否已经存在。问题是安全规则写检查总是通过,并且只在该位置(/username\u lookup/user1)设置新值 当我尝试使用实时数据库规则模拟器在此位置写入时,它会按预期工作,即写入被阻止 有人能发现问题吗 firebase安全规则Javascript Firebase安全规则数据.exists()不工作,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,在这篇文章之后,我创建了一个简单的安全规则和云函数,可以调用它来查看用户名是否已经存在。问题是安全规则写检查总是通过,并且只在该位置(/username\u lookup/user1)设置新值 当我尝试使用实时数据库规则模拟器在此位置写入时,它会按预期工作,即写入被阻止 有人能发现问题吗 firebase安全规则 "rules": { "username_lookup": { "$username": { // not readable, cannot get a lis
"rules": {
"username_lookup": {
"$username": {
// not readable, cannot get a list of usernames!
// can only write if this username is not already in the db
".write": "!data.exists()",
// can only write my own uid into this index
".validate": "newData.val() === auth.uid"
}
}
}
以及云功能
var fb = admin.database().ref();
createUser(uid, username);
function createUser(userId, usrname) {
fb.child('username_lookup').child(usrname).set(userId, function(unerr) {
if(unerr) {
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({error: "the_error_code" }));
}
});
}
用户名\查找对象/索引的屏幕截图
您可以通过以下方式访问Firebase数据库:
var fb = admin.database().ref();
如您所见,模块为admin
,表示您正在使用Firebase admin SDK。Firebase Admin SDK的关键特性之一是:
以完全管理员权限读取和写入实时数据库数据
资料来源:
因此,AdminSDK实际上绕过了您的安全规则
在基本流控制中使用错误处理程序也是一种非常糟糕的做法
相反,使用Firebase事务以原子方式读取/写入具有名称的位置:
fb.child('username_lookup').child(usrname).transaction(function(value) {
if (value) {
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({error: "the_error_code" }));
return; // abort the transaction
}
else {
return userId;
}
});
一如既往,我感谢你的回答!我很难找到关于如何获取非管理员数据库引用的文档。我读了这篇文章(仅供参考,答案中的链接是404),但是它是基于触发器和使用事件对象的。在我的云函数中,我使用post请求。我是否需要导入另一个Firebase SDK以获取非管理员引用?