2

当有人注册时,用户名和密码保存在 .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

$$$
4

5 回答 5

1

正如其他答案中所指出的,您应该考虑许多问题:

  1. 您不应该存储纯密码。根据密码计算哈希并存储哈希。

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

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

    joe:fjckdsoij48738423
    marian:fjccoekrnvn3iernci3en
    mrbean:fjd84jfn4u48fu4nf
    

当您想检查密码时(从第 1 点来看密码的哈希值),您可以逐行读取密码文件。在出现第一个 ':' 字符时拆分行以查找用户名和密码。与用户提供的数据进行比较。

于 2013-01-26T11:02:38.607 回答
1

这个 ...

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

意味着如果您在文本文件中找到用户名或密码,它将返回 true。我很确定你不想这样做。

最好使用两个标志(例如),您可以根据需要设置它们,foundUser然后foundPasswordreturn 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)

于 2013-01-22T23:50:21.377 回答
0

你真的应该为此使用数据库。

如果不是,最好的办法是扫描文件并使用以用户名作为键的 Map。但是,如果您的程序崩溃,您仍然需要相应地更新文件。

于 2013-01-22T23:49:26.313 回答
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.

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

于 2013-01-22T23:51:59.767 回答
-1

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

于 2013-01-22T23:49:22.730 回答