应用程序不比较MySQL数据库上的登录数据?

时间:2016-07-29 18:28:40

标签: java mysql encryption login passwords

我创建了一个登录框,用户必须输入用户名或密码。用户凭证以加密格式(AES)存储在MySQL数据库中。出于测试目的,当按下访问按钮时,框架将获取txtUsernametxtPassword中输入的数据,对其进行加密并在txtEncUNametxtEncPword中设置加密凭据。然后,应用程序会将加密凭据与txtEncUNametxtEncPword文本字段中的加密数据进行比较。

如果凭据正确,则授予用户访问权限并将其定向到相应页面,具体取决于他们是否具有管理员权限。如果他们的帐户已被锁定,则jLabel会通知他们,并且不会授予访问权限。当我之前测试过它时,它工作得很好,但现在我的问题出现了:

当我尝试登录时,应用程序立即说该帐户无法访问。我检查了凭证,他们是正确的。没有错误出现,堆栈跟踪也没有出现。

如何才能正确检查凭据?

以下是访问按钮使用的方法:

public void loginMethod()
{
String user = txtUsername.getText();
        String pwd = new String(txtPassword.getPassword());

        try
        {
            String enc1 = LoginFrame.encrypt(user);
            String enc2 = LoginFrame.encrypt(pwd);

            encUname.setText(enc1);
            encPword.setText(enc2);

            String aes1 = encUname.getText();
            String aes2 = encPword.getText();

            String getAccess = "select * from login_db";            

            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = (Connection)
            DriverManager.getConnection("jdbc:mysql://localhost:3306/user_db","root","password");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(getAccess);

            if(rs.next())
            {
                String username = rs.getString("emp_num");
                String password = rs.getString("pword");
                String access = rs.getString("adminAccess");
                String locked = rs.getString("accLocked");

                if((aes1.equals(username)) && (aes2.equals(password)) && (access.equals("Yes"))&& ("No".equals(locked)))
                {
                    AdminPage ap = new AdminPage();
                    ap.setVisible(true);
                    this.dispose();
                }

                else if ((aes1.equals(username)) && (aes2.equals(password)) && (access.equals("No"))&& ("No".equals(locked)))
                {
                    EmployeeMainPage emp = new EmployeeMainPage();
                    emp.setVisible(true);
                    this.dispose();
                }

                else if((aes1.equals(username)) && (aes2.equals(password)) && (access.equals("Yes"))&& ("Yes".equals(locked)))
                {
                    lblWrongLogin.setVisible(true);
                    lblWrongLogin.setText("Account inaccesible, please contact admin for support.");
                }
                else if((locked.equals("Yes")))
                {
                    lblWrongLogin.setVisible(true);
                    lblWrongLogin.setText("Account inaccessible, please contact admin for support.");
                }
        }
        }

        catch (Exception e)
        {
            JOptionPane.showMessageDialog(this, e);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

String getAccess = "select * from login_db";    

上面的查询选择数据库中的所有行,但是代码...

if(rs.next())

...仅检查第一行是否匹配 - 如果有多行,则会出现问题。请考虑更改查询以查找与用户名和密码匹配的内容

PreparedStatement ps = conn.prepareStatement( "select * from login_db where emp_num=? AND pword=?");
ps.setString(1, aes1);
ps.setString(2, aes2); 
ResultSet rs = ps.executeQuery();
if ( rs.next() ){
    //logic here
}