2015-10-05 76 views
0

我做了一個程序,它從數據庫獲取數據,然後授權,但問題是隻有最後一條記錄是正確的 - 登錄是成功的。JDBC - 授權用戶通過數據庫

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

您是否有任何錯誤或異常? – 2015-10-05 17:00:20

+0

感謝您的幫助,blm有權,這是環路故障。 –

回答

1

如果我理解你正在試圖做的(我可能不會)是什麼,你的問題是,用戶名和密碼的比較是while循環外,所以你:

while (rs.next()) 

只是遍歷整個結果集,所以當while循環結束,databaseUsername和databasePassword會從最後一個行讀取被設置爲值。

取而代之的是,在循環內部移動比較並設置一個標誌(默認爲false),如果找到正確的用戶名和密碼,則跳出循環,然後使用該標誌確定要打印的內容。

另外,您可能需要閱讀參數化查詢。通過使用PreparedStatement並進行查詢,您實際上可以讓數據庫爲您完成所有工作:

SELECT 1 from login where logins =?和密碼=?

如果結果集包含任何內容,那麼用戶輸入了有效的用戶名和密碼,否則他們沒有。查詢中的問號將使用PreparedStatement的set *方法設置爲名稱和密碼。

另一個說明 - 存儲明文密碼是一個可怕的想法。如果存儲密碼的表被暴露(通過各種攻擊或只是一個心存不滿的員工竊取密碼),那麼每個人都擁有所有用戶的密碼。伊克!你可能會爭辯說,你會採取措施來防止這種情況發生,但從安全角度來看,最好假設有一天桌子會受到損害,並盡你所能確保它不會造成太大的傷害。

+0

或更簡單:更改查詢以添加用戶名作爲參數,然後在外面進行密碼評估(因爲使用純文本密碼是不好的)。 –

+0

哈哈,我們都有同樣的想法。我建議將密碼傳遞給數據庫,因爲它已經使用了明文密碼,但你絕對正確,存儲明文密碼是一個可怕的想法。然而,良好的密碼管理方式超越了這裏直接問題的答案。 – blm

+0

是的,我知道,但至少說明的是,因爲每次你明文存儲密碼,密碼不應該被髮送到數據庫中,一隻小貓死:( –