我创建了一个登录框架,用户必须在其中输入用户名或密码。用户凭据以加密格式 (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/