2014-09-01 2 views
0

인증 기능이 있지만 정확한 로그인과 암호를 입력했을 때 올바른 경우에도 데이터가 올바르지 않다는 것을 항상 나타냅니다.잘못된 Java 인증 코드

코드

private String login1; 
private String password; 
private String Username=""; 
    private String Password=""; 
    @Override 
    public void authentification() { 
     try { 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      String url = "jdbc:mysql://localhost:3306/gestionticket" ; // a JDBC url 
      String user = "root"; 
      java.sql.Connection connection = DriverManager.getConnection(url, user,""); 
      Statement instruction = (Statement) ((java.sql.Connection) connection).createStatement(); 

      String sql = "select * from gestionticket.user " ;  
      ResultSet resultat = (ResultSet) instruction.executeQuery(sql); 

      while(resultat.next()){ 
       Username = resultat.getString("login"); 
       Password = resultat.getString("password"); 

      } 
      if (login1.equals(Username) && password1.equals(Password)) { 
        System.out.println("Successful Login!\n----"); 
       } else { 
        System.out.println("Incorrect \n----"); 

       } 

     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

답변

2

당신은 자바의 메모리에 DB에서 전체 사용자 테이블을 운반하고 있습니다 :

String sql = "select * from gestionticket.user " ;  
ResultSet resultat = (ResultSet) instruction.executeQuery(sql); 

그리고 당신이 을 통해 모든 행을 반복하는 것은 추출 로그인 및 암호 :

while(resultat.next()){ 
    Username = resultat.getString("login"); 
    Password = resultat.getString("password"); 
} 

이 줄 뒤에 UsernamePassword 변수는 마지막 줄의 값을 유지합니다.

로그인을 마지막 행의 값과 비교하기 때문에 사용자 테이블에 마지막으로 삽입 된 사용자에 대해서만 로그인이 성공할 수 있음을 알 것입니다.

if (login1.equals(Username) && password1.equals(Password)) { 

이 모든 접근 방식은 이해되지 않는다. 당신은 SQL의 힘을 이용하지 않습니다. 당신은 WHERE 절의 존재를 알지 못하는 것 같습니다. 사용자가 존재하는지 여부는 DB에 문의해야합니다. 그런 다음 로그인과 일치하는 레코드를 반환하거나 아무것도 반환하지 않습니다. 다음은 다시 작성한 것입니다.

PreparedStatement instruction = connection.prepareStatement("select * from gestionticket.user where login = ? and password = ?"); 
instruction.setString(1, Username); 
instruction.setString(2, Password); 
ResultSet resultat = instruction.executeQuery(); 

if (resultat.next()) { 
    System.out.println("Successful Login!\n----"); 
} else { 
    System.out.println("Incorrect \n----"); 
} 

코드에 더 큰 문제가 있습니다. DB 리소스가 누출되었습니다. 해시 대신 암호 평문을 저장하는 것 같습니다. java.sql 인터페이스의 모든 캐스트 또한 의미가 없습니다. java.sql 클래스 만 가져오고 DB 공급 업체 특정 클래스는 가져 오지 않도록하십시오. UsernamePassword과 같이 대문자 화 된 인스턴스/로컬 변수 이름은 Java 코드 규칙에 대한 추가 포인트를 제공하지 않습니다.

+0

Merciii Beaucoup – khadija

+0

: inputText의 내용을 db – khadija

+0

에있는 제 데이터와 비교하고 싶습니다. 안됩니다. DB는 이미 WHERE를 통해이를 수행합니다. 또는 주어진 사용자 이름/암호와 일치하는 올바른 레코드를 반환하는 경우 DB를 신뢰하지 않습니까? 왜 안돼? – BalusC