2014-09-01 6 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

Вы тащили всю таблицу пользователя из БД в память в Java:

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

И тогда вы цикл над каждую строку для извлечения логин и пароль:

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

После этой строки переменные Username и Password будут содержать значения последней строки.

Теперь вы, вероятно, поймете, что логин будет успешным только для последнего вставленного пользователя в таблице пользователя, потому что вы сравниваете логин со значениями последней строки.

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

Весь этот подход не имеет смысла. Вы не используете возможности SQL. Вы, похоже, не знаете о существовании предложения WHERE. Вы должны просто спросить БД, если пользователь существует или нет. Затем он вернет 1 запись, соответствующую логину или ничего. Вот перепишите:

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----"); 
} 

Обратите внимание, что ваш код имеет гораздо большие проблемы. Вы теряете ресурсы БД. Кажется, вы сохраняете открытый текст пароля вместо хеширования. Все эти отливки на интерфейсах java.sql также не имеют смысла. Убедитесь, что вы импортируете только классы java.sql, а не конкретные поставщики DB. Заглавные имена экземпляров/локальных переменных, такие как Username и Password, также не дают вам лишних точек относительно условных кодов Java.

+0

Merciii Beaucoup – khadija

+0

: Я хочу сравнить содержимое inputText с моими данными в db – khadija

+0

Нет. Вы не должны. БД уже делает это через 'WHERE'. Или вы не доверяете БД, если она возвращает правильную запись, соответствующую данному имени пользователя/паролю? Почему нет? – BalusC

Смежные вопросы