验证保存在Java文本文件中的用户名和密码

时间:2013-01-22 23:46:13

标签: java login

当有人注册时,用户名和密码将保存在.txt文件中。 下面的代码验证每一行以检查文件中是否存在用户名和密码。

但是,我不希望它以这种方式工作,因为它获得了一个随机密码的用户名... 我需要它来验证每个注册用户的用户名和密码,任何帮助? (我正在使用NetBeans)

public boolean isCustomer(){
    boolean isFound = false;
    String record = null;
    FileReader in = null;
    try{
        in = new FileReader ("login.txt");
        BufferedReader bin = new BufferedReader(in);
        record = new String();
        while ((record = bin.readLine()) != null)
        {
            if (NameTextField.getText().contentEquals(record))
                isFound = true;
            if (jPasswordField.getText().contentEquals(record))
                isFound = true;
        }

    bin.close();
    bin = null;
 }catch(IOException ioe){
    NameTextField.setText("IOProblem");
 }   
  return isFound;
}

login.txt看起来像这样(用户名,然后是密码,“$$$”作为分隔符):

Joe

656451asda

$$$

Robert

123456hbb

$$$

Tracey

56464999abc

$$$

Celia

abc1234897

$$$

5 个答案:

答案 0 :(得分:1)

这......

if (NameTextField.getText().contentEquals(record))
    isFound = true;
if (jPasswordField.getText().contentEquals(record))
    isFound = true;

表示如果在文本文件中找到用户名或密码,则返回true。我很确定你不想这样做。

最好使用两个标记(例如foundUserfoundPassword),您可以根据需要设置,然后return foundUser && foundPassword

根据反馈更新

检查用户名/密码值时,您需要确保您尝试匹配的密码与用户匹配,例如......

if (foundUser && jPasswordField.getText().contentEquals(record)) {
    foundPassword = true;
    break; // No need to compare any more details...
} else {
    foundUser = false;
}
if (NameTextField.getText().contentEquals(record)) {
    foundUser = true;
}

<强>更新

作为旁注,你真的不应该使用JPasswordField#getText,因为这是一个安全风险。您应该使用JPassword#getPassword并使用Arrays.equals(char[], char[])进行比较。

这显然会引起您如何从文本文件中读取数据的问题。

(请注意,在文本文件中使用用户名/密码可能存在更大的安全风险:P)

答案 1 :(得分:0)

你应该真正使用数据库。

如果不是,那么下一个最好的事情就是扫描文件并使用带有用户名的Map作为密钥。但是,如果程序崩溃,您仍需要相应地更新文件。

答案 2 :(得分:0)

您不能对用户名和密码使用相同的布尔值。一旦找到它,它将被设置为true,如果它找到另一个并不重要(这是错误的,它们都需要在那里!)。

我会这样设置:

private String getUsername(String filename) {
    // 1. Open up the file.
    // 2. Return the String.
}

private String getPassword(String filename) {
    // Basically the same, but return the password.
}

然后,在isCustomer()中你可以这样做:

String username = getUsername(filename);
String password = getPassword(filename);
return (username != null) && (password != null); // makes sure they're both there.

(另外,你真的不应该将它存储在一个未加密的文本文件中。这是一个非常糟糕的主意,如果你想成为一名程序员,你需要学习它。)

答案 3 :(得分:0)

正如其他答案所指出,你应该考虑很多问题:

  1. 您不应存储普通密码。从密码计算哈希值并存储哈希值。

  2. 如果可能,请使用数据库而不是文本文件

  3. 如果您不能使用数据库存储单行文本的用户名/密码信息。这是一种类似于Unix密码文件中使用的格式:

    joe:fjckdsoij48738423
    marian:fjccoekrnvn3iernci3en
    mrbean:fjd84jfn4u48fu4nf
    
  4. 如果要检查密码(从第1点开始的密码哈希),您可以逐行读取密码文件。在第一个':'字符出现时拆分该行以查找用户名和密码。与用户提供的数据进行比较。

答案 4 :(得分:-1)

将用户名和密码放在同一行文本中。