如何在Java-mysql中验证用户名和密码?

4
我该如何以最正确的方式验证用户输入的用户名和密码与数据库匹配呢?
In c++, we used to verify by using if-else:
    if((user == "username")&&(pass == "password")){
             cout<<"You are now logon!";
    }

在Java-MySQL中,我不确定自己是否在正确的轨道上:
登录按钮
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:

        user = jTextField1.getText();
        pass = jPasswordField1.getPassword();
        login();
}

方法/函数

private void login() {

        try {
                if (user != null) {
                sql = "Select * from users_table Where username='" + user + "'";
                rs = stmt.executeQuery(sql);

                rs.next();
                username = rs.getString("username");
                password = rs.getString("password");

            }
        } 
    catch (SQLException err) {
            JOptionPane.showMessageDialog(this, err.getMessage());
        }

}

如果用户输入的用户名和密码与数据库中的匹配,则会将其重定向到新的jFrame,否则将弹出消息对话框,显示无效的用户名或密码。有人能帮助我编写代码吗?我不知道如何在mysql中使用if-else语句。
谢谢! :)

4
你们以明文形式保存密码?希望这不会被部署。 - shazin
你没有使用PreparedStatement来防止SQL注入...你正在以明文方式获取值...这是我看到的两个主要问题。我也没有看到你实际上在对密码的值进行任何比较。 - Makoto
5个回答

2
  • 始终将哈希加密密码存储在数据库中,有关加密密码的更多详细信息,请参阅JASYPT
  • 加密用户输入的密码并比较两个加密后的密码
  • 在查询数据库时使用参数化查询

1
请记住哈希不是加密。您应该存储已哈希的密码。JASYPT有正确的想法,即盐 + 迭代您的哈希。 - Cameron Skinner

2

实现以下代码:

private void login() {
    try {
        if (user != null && pass != null) {
            String sql = "Select * from users_table Where username='" + user + "' and password='" + pass + "'";
            rs = stmt.executeQuery(sql);
            if (rs.next()) {
                //in this case enter when at least one result comes it means user is valid
            } else {
                //in this case enter when  result size is zero  it means user is invalid
            }
        }

        // You can also validate user by result size if its comes zero user is invalid else user is valid

    } catch (SQLException err) {
        JOptionPane.showMessageDialog(this, err.getMessage());
    }

}

3
这个方法可以运行,但使用它存在SQL注入的危险。你应该使用PreparedStatement而不是自己拼接查询语句。所以应该这样写:connection.prepareStatement("select * from user_table where username = ? and password = ?"); p.setString(1, "Tom")... - zdenda.online
7
这个解决方案展示了两种极其糟糕的做法:串联不干净的字符串可能导致SQL注入,以及假设密码是直接存储在数据库中的。就目前而言,这会产生积极的危害。 - Bartek Banachewicz
除了SQL注入和明文密码问题外,在Java中建议使用char[]而不是String来存储密码。 - Johnny Willer
用户名: admin 密码: ' OR password <> ' - Yanick Rochon

0

使用预处理语句以及类似DButils的库,可以极大地简化您的工作。

此外,请不要使用替换传递参数,例如select name from members where code =?。如果您有很多参数,则创建对象数组并将它们传递给数组,例如Objects[] parms = {code1,code2}


0

你不需要再处理MySQL了。你已经有了凭据。 一个例子:

if ((user.equals(username)) && (pass.equals(password))) {
   JFrame newFrame = new JFrame();
} else {
   JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE); 
}

用户和密码是用户输入的对吗?那么用户名和密码就是结果集了吗?用户名 = rs.getString("username"); 密码 = rs.getString("password"); 对吗? @_@ - Gian7
根据您的来源,用户和密码是用户输入,数据库中的字段分别为密码和用户名。 - Obl Tobl
字符串应该使用 equals 进行比较,而不是 == - Henry

-1
if (username.length()>0 && password.length()>0)
{
    String query = "Select * from adminlogin Where Username='" + username + "' and Password='" + password + "'";

    rs = sta.executeQuery(query);

   if (rs.next()) 
   {

        home hme=new home();
        this.setVisible(false);
        hme.setVisible(true);
   } 
   else 
   {
       JOptionPane.showMessageDialog(null,"username and password are wrong ");
   }
}
else
{
      JOptionPane.showMessageDialog(null,"please field username and password ");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接