JDBC - 通过数据库授权用户

时间:2015-10-05 16:57:44

标签: java mysql jdbc authorization

我已经创建了一个从数据库获取数据然后进行授权的程序,但问题只是最后一条记录是正确的 - 登录成功。

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();

    }

} }

1 个答案:

答案 0 :(得分:1)

如果我理解你要做的事情(我可能不会这样做),你的问题是用户名和密码的比较在while循环之外,所以你的:

while (rs.next())

只循环遍历整个结果集,因此当while循环结束时,databaseUsername和databasePassword将被设置为读取的最后一行的值。

相反,在循环内移动比较并设置一个标志(默认为false),如果找到正确的用户名和密码则跳出循环,然后使用该标志确定要打印的内容。

此外,您可能希望阅读参数化查询。实际上,您可以通过使用PreparedStatement并进行查询来让数据库为您完成所有工作:

来自用户的SELECT 1 = logins =?和密码=?;

如果结果集包含任何内容,则用户输入有效的用户名和密码,否则他们没有。查询中的问号将使用PreparedStatement的set *方法设置为名称和密码。

另一个注意事项 - 存储明文密码是一个可怕的想法。如果存储密码的表被暴露(通过各种攻击或只是一个不满的员工窃取它),那么每个人都拥有所有用户的密码。伊克!您可能会争辩说,您将采取措施来防止这种情况,但从安全角度来看,最好假设有一天桌子会受到损害,并尽一切可能确保它不会太危害。