【问题标题】:Looping in javascript through a list of users通过用户列表在 javascript 中循环
【发布时间】:2020-12-31 17:54:52
【问题描述】:

我有一个存储在数组中的用户列表

accountsade: [
    {
        id: 0.4387810413935975
        name: "Adrian"
        password: "345"
        userName: "nathanael"
    },
    {
        id: 0.2722524232951682
        name: "Nathan"
        password: "123"
        userName: "nathanaelmbale45"
    }
],

我想遍历用户列表并捕获值passwordusername 数组中的每个对象,并将它们与已经存在的变量进行比较。

usernameL = "nathanaelmbale45"
passwordL = "123"

【问题讨论】:

  • 对前端进行身份验证绝对不是一个好主意。通过使用开发人员工具,任何人都可以访问每个用户名和密码。
  • 密码被散列而不是以纯文本形式存储也是一个安全基础。
  • Appart from that, 你在找array.find

标签: javascript html authentication frontend


【解决方案1】:
    <script>
    let accountsade = [
        {
            id: 0.4387810413935975,
            name: "Adrian",
            password: "345",
            userName: "nathanael",
        },
        {
            id: 0.2722524232951682,
            name: "Nathan",
            password: "123",
            userName: "nathanaelmbale45"
        }
    ]
    let userName = 'nathanael', password = '345';
    let account = accountsade.filter((item) => {
        return item.userName === userName && item.password == password;
    });
    console.log(account);
</script>

-----------#输出#-----------------

[{"id":0.4387810413935975,"name":"Adrian","password":"345","userName":"nathanael"}]

【讨论】:

  • 对您的代码进行一些解释会很好。但无论如何我都赞成。
  • 当然,如果你想从数组中过滤记录,而不是使用for循环,最好的方法是使用.filter函数,更多细节打开以下链接w3schools.com/jsref/jsref_filter.asp
  • 好主意。但我的意思是说你应该添加这个解释作为你的解决方案。
  • 是的,我会在后面添加解释,谢谢!
【解决方案2】:
  1. 仅捕获数组上的映射并返回所需字段

objectArrap.map(object=>({object.property, object.property2}))

您可以使用类似的方法进行比较,称为过滤器和查找。如果您需要做一些专门的事情,请考虑使用 objectsArarray.foreach 遍历每个对象

【讨论】:

    【解决方案3】:

    如 cmets 中所述,在客户端代码中执行此操作将是一个坏主意,因为您将所有用户名和密码暴露给可以在浏览器控制台中轻松找到的东西...

    为了理解数组函数...这将根据匹配的用户名和密码返回数组中的第一个匹配对象。

    var accountsade = [
      {
        id: 0.4387810413935975,
        name: "Adrian",
        password: "345",
        userName: "nathanael"
      },
      {
        id: 0.2722524232951682,
        name: "Nathan",
        password: "123",
        userName: "nathanaelmbale45"
      }
    ];
    
    var usernameL = "nathanaelmbale45";
    var passwordL = "123";
    
    ///////////////////////////////////////////////////////////////////
    // array.find takes as its arrgument a function that gets run
    // against each element of the array
    //
    // array.find will return the current element being supplied
    // the first time the provided function returns a "true" value
    //
    // if the provided function always returns a "false" value...
    // then array.find will return the value "undefined"
    ///////////////////////////////////////////////////////////////////
    
    var authUser = accountsade.find(function(element) {
      var returnValue = true;
      returnValue &= element.userName == usernameL;
      returnValue &= element.password == passwordL;
      return returnValue
    });
    
    console.log(authUser);

    【讨论】:

      【解决方案4】:

      首先:像这样对用户进行身份验证是不安全的。我会在一分钟内告诉你原因,但让我们先解决你的实际问题。

      您可以使用 JavaScript 的 Array.prototype.filter() 函数来获取列表中的正确对象。然后,您可以检查该对象的密码是否与输入匹配:

      const json = {
          accountsade: [
              {
                  id: 0.4387810413935975,
                  name: "Adrian",
                  password: "345",
                  userName: "nathanael"
              },
              {
                  id: 0.2722524232951682,
                  name: "Nathan",
                  password: "123",
                  userName: "nathanaelmbale45"
              }
          ]
      };
      
      const usernameL = "nathanaelmbale45";
      const passwordL = "123";
      
      alert(checkLogin(usernameL, passwordL));
      
      function checkLogin(username, password) {
          const account = json.accountsade.find(account => {
            return account.userName = username;
          });
          return account.password == password;
      }

      正确的身份验证

      验证用户的目的是确保用户是他/她所说的他/她。这样,您就可以在代码中决定用户可以采取哪些操作。

      此过程应在应用程序的后端(服务器端)进行,以确保用户无法看到和操作它。如果您将所有帐户数据发送到前端(您用户的计算机),该人可以看到所有这些数据并使用其他用户的密码登录。

      你也没有hash the passwords(以不可逆的方式打乱它们的内容)。这甚至应该在处理身份验证服务器端时完成,因为您的数据库可能会因另一个安全故障而受到损害和泄漏。

      将所有帐户数据发送到前端的另一个缺点是带宽。假设您有一百万个用户,这将花费大量冗余时间和资源来登录用户。

      所以正确的方法是:发送用户输入的用户名和密码via a secure connection(这样没有人可以窃听),从数据库中获取哈希密码,对用户输入的密码进行哈希处理,并将其与获取的哈希值进行比较.如果它们完全匹配,则用户是合法的并且可以登录(在服务器端设置适当的 cookie 或发送authentication token)。

      现在这些是基础知识,但是使用经过验证的解决方案(例如为您完成这项工作的框架和库)而不是自己构建它会更安全(很多用户已经查看了代码并对其进行了改进,另一方面可能会出错/造成安全风险)。

      【讨论】:

        猜你喜欢
        • 2020-06-07
        • 2015-05-21
        • 2020-07-08
        • 1970-01-01
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        • 2012-01-11
        • 2022-01-08
        相关资源
        最近更新 更多