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

标签 java mysql encryption authentication passwords

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

如果凭据正确,用户将被授予访问权限并定向到相应的页面,具体取决于他们是否具有管理员访问权限。如果他们的帐户已被锁定,那么他们将收到 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);
        }
    }
}

最佳答案

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
}

关于java - 应用程序不比较 MySQL 数据库上的登录数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38665347/

相关文章:

java - 我们可以同时读取和写入文件吗?

java - 在 cassandra 中使用触发器

php - Mysql - 查找以字符串开头的短语并删除其后的所有内容

java - 是否可以通过 java 中的 bouncycaSTLe 使用 SMIME 加密常规文件

algorithm - 我应该使用哪种公钥算法来加密一小部分字节?

java - 需要帮助读取 java 中的文件

java - java中的异常或null

PHP PDO,连接有效,购买查询未执行

php - 清理阵列

php - 如何使用 laravel 4 邮件方法设置 hotmail?