我需要一种方法来打破这种循环,或者需要一种替代方法来实现这一点

时间:2019-04-16 11:30:40

标签: javascript firebase firebase-realtime-database

我是js和firebase的新手。我正在尝试通过使用自己的名为用户的表将Firebase数据库用于自定义登录。我已经为每个循环使用了一个遍历数据。但是其他部分因此会多次执行。我需要打破循环,这样就不会发生。

这是我的数据:-

{"users" : [ {
    "userId" : "1",
    "username" : "admin",
    "password" : "admin",
    "type" : "admin"
  }, {
    "userId" : "2",
    "username" : "cashier",
    "password" : "cashier",
    "type" : "cashier"  
  }]
}**

这是我写的代码:

var database=firebase.database();

function SignIn(){
var txtuser=document.getElementById('username').value;
var txtpass=document.getElementById('password').value;
var error=false;

firebase.database().ref('users').orderByKey().once('value').then(function(snapshot) {
  snapshot.forEach(function(childSnapshot) {
    var users = childSnapshot.child('username').val();
    var pass=childSnapshot.child('password').val();

    if(txtuser==users && txtpass==pass){
      var type=childSnapshot.child('type').val();       
      if(type=="admin"){
        location.href="admin.html";
      }
      else if(type=="cashier"){
        location.href="cashier.html";
      }            
    }
    else{
      error=true;            
    }       
  });
});

if(error==true)
{
  window.alert("Invalid Credentials");
  location.href="index.html";
}
}

2 个答案:

答案 0 :(得分:1)

密码验证

请使用Sign in a user with an email address and password流,而不要使用在数据库中存储身份验证详细信息的方法。

但是,由于您使用的是用户名而不是电子邮件,因此请将存储桶域附加到用户名(通常为PROJECT_ID.appspot.com)上。

因此,您的"admin""cashier"用户将成为"admin@PROJECT_ID.appspot.com""cashier@PROJECT_ID.appspot.com"。为了进行电子邮件身份验证,即使没有收件箱,这些也是有效的电子邮件地址。

然后,您可以在整个Web应用程序中使用firebase.auth()来管理用户对“ admin.html”和“ cashier.html”等页面的访问控制。

注意:如果您曾经向用户发送过电子邮件,请确保省略与"*@PROJECT_ID.appspot.com"匹配的电子邮件

回答问题

警告:请勿以这种方式进行验证。请使用以上方法。

  • 密码绝对不要以纯文本格式存储
  • 密码绝不能以纯文本格式存储
  • 用户应该永远不能访问任何数据库中其他用户的凭据

为回答问题,您可以使用以下代码:

var database=firebase.database();

function SignIn(){
    var txtuser=document.getElementById('username').value;
    var txtpass=document.getElementById('password').value;

    firebase.database().ref('users').orderByChild('username').equalTo(txtuser).once('value')
        .then(function(snapshot) {
            if (!snapshot.hasChildren()) {
                throw "username not found";
            } else if (snapshot.numChildren() != 1) {
                throw "duplicate usernames";
            }

            // only one child at this point, so only called once
            snapshot.forEach(function(childSnapshot) {
                if (pass != childSnapshot.child('password').val()) {
                    throw "password mismatch";
                }

                var type=childSnapshot.child('type').val();
                if(type=="admin") {
                    location.href = "admin.html";
                } else if(type=="cashier") {
                    location.href = "cashier.html";
                } else {
                    throw "unknown user type";
                }
            })
        })
        .catch(function(error) { // catches any errors thrown by promises
            location.href = "index.html";
        });
}

在上面的代码中,每个throw被Firebase查询返回的Promise捕获。您可以阅读Promises here

答案 1 :(得分:0)

只需检查errortrue是否设置为.forEach并使用return来“突破”:

var database=firebase.database();

function SignIn(){
  var txtuser=document.getElementById('username').value;
  var txtpass=document.getElementById('password').value;
  var error=false;

  firebase.database().ref('users').orderByKey().once('value').then(function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
      var users, pass;
      
      if (error) { return; } // <-- "break" the "loop"
      
      users = childSnapshot.child('username').val();
      pass = childSnapshot.child('password').val();
      if(txtuser == users && txtpass == pass){
        var type=childSnapshot.child('type').val();       
        if(type == "admin"){
          location.href="admin.html";
        }
        else if(type == "cashier"){
          location.href="cashier.html";
        }            
      } else {
        error = true;            
      }       
    });

    if(error) {
      window.alert("Invalid Credentials");
      location.href="index.html";
    }
  });
}