我创建了一个登录框,用户必须输入用户名或密码。用户凭证以加密格式(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);
}
}
}
答案 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
}