2016-11-04 7 views
0

Я написал очень простую программу, которая читает в имени пользователя и пароле из текстового файла, где имя пользователя и пароль разделяются запятой. Содержимое текстового файла содержит следующие
accounts.txt
Alex, 1234
Давид, написано 5678Помощь в простой системе аутентификации в Java

Мое приложение Java следующим

public class Authenticate { 

public void signIn(String username, String password) throws IOException { 

    FileReader fr = new FileReader("location/accounts.txt"); 
    BufferedReader br = new BufferedReader(fr); 

    while (true) {//read file line by line 
     String line = br.readLine(); 
     if (line == null) { 
      break; 
     } 

     String splitByComma = ","; 
     String[] details = line.split(splitByComma); 
     String registeredUser = details[0]; 
     String registeredPass= details[1]; 

    if(username.equals(registeredUser) && password.equals(registeredPass)){ 
     System.out.println("signed in successfully!"); 
    } 
    else{ 
     System.out.println("sign in failed"); 
    } 

    } 
    br.close(); 

} 

}

Мои Класс приложения, который называется программой:

public class App { 

public static void main(String[] args) throws IOException { 

    Register register = new Register("location/accounts.txt"); 

    Authenticate auth = new Authenticate(); 

    auth.signIn("David", "5678"); 
} 

}

Проблема заключается в том, когда я прохожу в «Alex» «1234» в методе, например, выход
подписан в успешно!
вход не удался

И когда я прохожу в «Давиде», «5678» я получаю
знак в неудавшейся
подписанного в успешно!

Я хочу, чтобы приложение выводило «подписанные успешно» и «вход в систему не удалось» только один раз в зависимости от введенных учетных данных.

Большое спасибо!

+1

Просто создать строковую переменную с: результат String = «Ошибка входа»; перед вашей петлей. Затем измените результат, если пользователь был найден к вашему результату.после того, как цикл напишет переменную результата на выходе консоли. Кроме того, вы также можете сделать перерыв, когда вы нашли пользователя -> нет смысла читать остальное, если вы нашли совпадение – Gildraths

+0

У меня есть лучшее понимание проблемы. Каждый раз, когда он зацикливается на файле и находит имя пользователя и пароль, которые не соответствуют ему, вызывает «вход в систему не удался», пока он окончательно не найдет имя пользователя и пароль, он назовет «успех входа» n – BigAl1992

+0

Если это то, что вы хотите просто добавить ломать; после консольного вывода успеха – Gildraths

ответ

1

Это означает, что вы дважды вызываете свой метод с разными значениями. Проверьте код вызова (который вы нам не предоставили).

Другие замечания:

Пожалуйста, не считаю, что-то подобное для серьезной проверки подлинности. Пароли должны быть, по крайней мере, хэшированы в вашем файле (например, с использованием BCrypt). Существует множество инфраструктур, которые предлагают решения для проверки подлинности в отрасли, которые вы должны использовать вместо того, чтобы «сворачивать свои собственные».

Вы должны закрыть ресурсы в одном из следующих способов:

1) в финальном блоке:

BufferedReader br = null; 
try { 
    br = new BufferedReader(...); 
    // do stuff 
} 
finally {  
    if (br != null) { 
     br.close(); 
    } 
} 

2) с использованием Java 8 примерочных с-ресурсами идиомы:

try (BufferedReader br = new BufferedReader(...)) {  
    // do stuff 
} 

(BufferedReader будет автоматически закрыт средой выполнения)

В вашем exa mple выше, вы должны, вероятно, проверить вход для нулевых значений, прежде чем проверять значения с помощью .equals.

+0

это не для серьезной аутентификации любыми способами. – BigAl1992

0

Первый поиск имени пользователя. После того, как найдено, проверьте пароль и выйти из цикла:

public class Authenticate { 
    public void signIn(String username, String password) throws IOException { 
     try (
      FileReader fr = new FileReader("location/accounts.txt"); 
      BufferedReader br = new BufferedReader(fr); 
     ) { 
      boolean success = false; 
      String line; 
      while ((line = br.readLine()) != null) { 
       String[] details = line.split(","); 
       String registeredUser = details[0]; 
       if (registeredUser.equals(username)) { 
        String registeredPass = details[1]; 
        success = registeredPass.equals(password); 
        break; 
       } 
      } 
      System.out.println(success ? "signed in successfully!" : "sign in failed"); 
     } 
    } 
} 

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

  • Нет связанных вопросов^_^