Javascript Firebase安全规则数据.exists()不工作

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

在这篇文章之后,我创建了一个简单的安全规则和云函数,可以调用它来查看用户名是否已经存在。问题是安全规则写检查总是通过,并且只在该位置(/username\u lookup/user1)设置新值

当我尝试使用实时数据库规则模拟器在此位置写入时,它会按预期工作,即写入被阻止

有人能发现问题吗

firebase安全规则

"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以获取非管理员引用?