【问题标题】:Assistance on simple authentication system in Java协助Java中的简单身份验证系统
【发布时间】:2016-11-04 12:24:05
【问题描述】:

我编写了一个非常简单的程序,它从文本文件中读取用户名和密码,其中用户名和密码用逗号分隔。文本文件的内容包含以下
accounts.txt
亚历克斯,1234
大卫,5678

我的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();

}

}

调用程序的我的App类:

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”时,输出是
登录成功!
登录失败

当我传入“David”“5678”时,我得到了
登录失败
登录成功!

我希望应用程序根据输入的凭据仅输出一次“登录成功”和“登录失败”。

非常感谢!

【问题讨论】:

  • 只需创建一个字符串变量:String result = "sign in failed";在你的循环之前。如果找到用户,则将结果更改为您的结果。在循环之后将结果变量写入控制台输出。此外,您还可以在找到用户时休息一下 -> 如果找到匹配项,则无需阅读其余部分
  • 我对这个问题有了更好的理解。每次遍历文件并找到不匹配的用户名和密码时,它都会调用“登录失败”,直到最终找到用户名和密码,它将调用“登录成功”n
  • 如果这是你想要的,只需添加 break;成功后的控制台输出
  • 仍然打印失败和成功。这是因为输入只匹配文件的第二行,这就是它打印失败然后成功的原因。
  • 如果您只想显示一个状态,请查看我的第一条评论。我不完全清楚你到底想展示什么。

标签: java arrays split filereader


【解决方案1】:

这意味着您使用不同的值调用您的方法两次。检查调用代码(您尚未提供给我们)。

其他说明:

请不要考虑这样的严肃身份验证。密码至少应该在您的文件中进行散列(例如使用BCrypt)。有许多框架提供行业强度的身份验证解决方案,您应该使用这些解决方案,而不是“自己动手”。

您应该通过以下方式之一关闭资源:

1) 在 finally 块中:

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

2) 使用 Java 8 try-with-resources 习惯用法:

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

(BufferedReader会被运行环境自动关闭)

在上面的示例中,您可能应该在使用.equals 检查值之前检查输入的空值。

【讨论】:

  • 这绝不是为了严肃的身份验证。
【解决方案2】:

首先搜索用户名。找到后,检查密码并退出循环:

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

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    相关资源
    最近更新 更多