我已经创建了一个从数据库获取数据然后进行授权的程序,但问题只是最后一条记录是正确的 - 登录成功。
public class Test {
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/uzytkownicy";
static final String USER = "root";
static final String PASS = "";
public static void main(String[] args) throws SQLException, ClassNotFoundException {
System.out.print("login: ");
Scanner zm1= new Scanner(System.in);
String name = zm1.next();
System.out.print("pass: ");
Scanner zm2 = new Scanner(System.in);
String password = zm2.next();
try{
Class.forName("com.mysql.jdbc.Driver");
System.out.println("Connecting...");
Connection conn = DriverManager.getConnection(DB_URL,USER,PASS);
Statement stmt = conn.createStatement();
String sql = "SELECT logins, passwords FROM users";
ResultSet rs = stmt.executeQuery(sql);
String databasePassword = null;
String databaseUsername = null;
while (rs.next()) {
databaseUsername = rs.getString("logins");
databasePassword = rs.getString("passwords");
}
if (name.equals(databaseUsername) && password.equals(databasePassword)) {
System.out.println("Logged in!");
}
else {
System.out.println("Bad Pass/Login");
}
rs.close();
stmt.close();
conn.close();
}
catch(SQLException se){
se.printStackTrace();
}
} }
答案 0 :(得分:1)
如果我理解你要做的事情(我可能不会这样做),你的问题是用户名和密码的比较在while循环之外,所以你的:
while (rs.next())
只循环遍历整个结果集,因此当while循环结束时,databaseUsername和databasePassword将被设置为读取的最后一行的值。
相反,在循环内移动比较并设置一个标志(默认为false),如果找到正确的用户名和密码则跳出循环,然后使用该标志确定要打印的内容。
此外,您可能希望阅读参数化查询。实际上,您可以通过使用PreparedStatement并进行查询来让数据库为您完成所有工作:
来自用户的SELECT 1 = logins =?和密码=?;
如果结果集包含任何内容,则用户输入有效的用户名和密码,否则他们没有。查询中的问号将使用PreparedStatement的set *方法设置为名称和密码。
另一个注意事项 - 存储明文密码是一个可怕的想法。如果存储密码的表被暴露(通过各种攻击或只是一个不满的员工窃取它),那么每个人都拥有所有用户的密码。伊克!您可能会争辩说,您将采取措施来防止这种情况,但从安全角度来看,最好假设有一天桌子会受到损害,并尽一切可能确保它不会太危害。