Java 通过比较数据库中的用户详细信息来登录用户

Java 通过比较数据库中的用户详细信息来登录用户,java,sql,netbeans,Java,Sql,Netbeans,我想确保当用户输入用户名和密码时,通过检查输入是否与用户表中的某一行匹配来完成身份验证。 以下是迄今为止的代码:它只允许数据库中的第一个用户登录。请建议我如何将其设置正确。谢谢 private class thehandler implements ActionListener { @Override public void actionPerformed(ActionEvent ae) { String namevalue = usertext.getText(

我想确保当用户输入用户名和密码时,通过检查输入是否与用户表中的某一行匹配来完成身份验证。 以下是迄今为止的代码:它只允许数据库中的第一个用户登录。请建议我如何将其设置正确。谢谢

private class thehandler implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent ae) {
        String namevalue = usertext.getText();
        String pwdvalue = pwdtext.getText();

        //read values from user table in sql database    
   try {
        Class.forName("com.mysql.jdbc.Driver");
        String conUrl = "jdbc:mysql://localhost/hall?" +
                               "user=root&password=blend";

        Connection con = DriverManager.getConnection(conUrl);
        Statement stmt = con.createStatement();

        ResultSet rs = stmt.executeQuery("SELECT * FROM user");

        while(rs.next()) {

            if(namevalue.equals(rs.getString("userName")) && pwdvalue.equals(rs.getString("password"))) {
            JOptionPane.showMessageDialog(null, "You are logged in", 
                    "Makhall login", JOptionPane.INFORMATION_MESSAGE);
            //move on to homepage if user is valid
            homePage home = new homePage();
            home.setAlwaysOnTop(rootPaneCheckingEnabled);
            }
            else {

            JOptionPane.showMessageDialog(null, "Incorrect username or password",
                    "Error", JOptionPane.ERROR_MESSAGE);
            }
            break;
        }
    }
    catch (SQLException e) {
        System.out.println("SQL Exception: "+ e.toString());
    } 
    catch (ClassNotFoundException cE) {
        System.out.println("Class Not Found Exception: "+ cE.toString());
    }

  }
}

对不起,我认为这是一个糟糕的代码。您将所有内容混合在一起:UI、数据库连接、查询等。Java是一种面向对象的语言。好的对象设计的租户之一是内聚性:让一个类做好一件事

首先,将数据库查询分离为数据访问对象。让它工作,测试它,让其他客户机简单地使用它。您将通过让更简单的对象协作来构建复杂的解决方案

直接的问题是SELECT需要WHERE子句:
WHERE username=?

您只想检查手边用户的密码


这个问号是经过深思熟虑的:使用事先准备好的陈述,而不是陈述

对不起,我认为这是一个糟糕的代码。您将所有内容混合在一起:UI、数据库连接、查询等。Java是一种面向对象的语言。好的对象设计的租户之一是内聚性:让一个类做好一件事

首先,将数据库查询分离为数据访问对象。让它工作,测试它,让其他客户机简单地使用它。您将通过让更简单的对象协作来构建复杂的解决方案

直接的问题是SELECT需要WHERE子句:
WHERE username=?

您只想检查手边用户的密码


这个问号是经过深思熟虑的:使用事先准备好的陈述,而不是陈述

您正在从数据库中选择所有用户。永远不要这样做。而是选择具有给定登录名的用户。如果存在,请检查密码。如果它不存在,那么登录本身就不正确

此外:

  • 将数据库访问代码与UI代码分开。这些应该分为不同的类别
  • 不要在数据库中存储纯文本密码。对密码加盐,对其进行散列,要检查密码,对密码加盐,对其进行散列,并将其与存储在数据库中的加盐和散列的密码进行比较

您正在从数据库中选择所有用户。永远不要这样做。而是选择具有给定登录名的用户。如果存在,请检查密码。如果它不存在,那么登录本身就不正确

此外:

  • 将数据库访问代码与UI代码分开。这些应该分为不同的类别
  • 不要在数据库中存储纯文本密码。对密码加盐,对其进行散列,要检查密码,对密码加盐,对其进行散列,并将其与存储在数据库中的加盐和散列的密码进行比较

    • 我也制作了同样的程序。请看这里:

      String m=jt1.getText();
      String n= new String(jt2.getPassword());
      try{        
                 Connection con = DriverManager.getConnection("jdbc:mysql://localhost/darshanproject","root","");
                 Statement st = con.createStatement();
                 String q="select * from emp where UID='"+m+"'";
                 ResultSet rs=st.executeQuery(q);
                 rs.next();
                 String user, pass;
                 user =rs.getString("UID");
                 pass =rs.getString("password");
                 { if(m.compareTo(user)==0)
                       if(n.compareTo(pass)==0)
                           System.out.println("login Success");
                       else
                           System.out.println("Wrong Password");
      
                 }
             }catch(Exception ex){
                 System.out.println(ex);
             }
      

      我也做了同样的节目。请看这里:

      String m=jt1.getText();
      String n= new String(jt2.getPassword());
      try{        
                 Connection con = DriverManager.getConnection("jdbc:mysql://localhost/darshanproject","root","");
                 Statement st = con.createStatement();
                 String q="select * from emp where UID='"+m+"'";
                 ResultSet rs=st.executeQuery(q);
                 rs.next();
                 String user, pass;
                 user =rs.getString("UID");
                 pass =rs.getString("password");
                 { if(m.compareTo(user)==0)
                       if(n.compareTo(pass)==0)
                           System.out.println("login Success");
                       else
                           System.out.println("Wrong Password");
      
                 }
             }catch(Exception ex){
                 System.out.println(ex);
             }
      

      你甚至都不说有什么问题。如果您希望有人评估您的代码,请尝试,否则请告诉我们什么不起作用以及它的作用。考虑到您发布的代码的质量和存在的问题,我只能建议您不要在没有真正了解web安全性的情况下实施自己的安全措施。您是否将密码以明文形式存储在数据库中?哎呀。这是什么网站,所以我不注册?我喜欢它如何防止sql注入,通过暴力请求每个用户名和密码组合来执行身份验证。你甚至不说它有什么问题。如果您希望有人评估您的代码,请尝试,否则请告诉我们什么不起作用以及它的作用。考虑到您发布的代码的质量和存在的问题,我只能建议您不要在没有真正了解web安全性的情况下实施自己的安全措施。您是否将密码以明文形式存储在数据库中?哎呀。这是什么网站,所以我不注册?我喜欢这一部分,它如何防止sql注入暴力要求每个用户名和密码组合来执行身份验证。。