我创建了一个登录框架,用户必须在其中输入用户名或密码。用户凭证以加密格式(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
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句