如何编码管理器以在Java netbeans(gui)中使用用户名和密码注册收银员,并对收银员进行登录验证



这是一个银行系统,我必须创建两个用户级别,经理和收银员。我必须为经理提供用户名和密码,经理必须为收银员提供用户名和密码。我不太确定如何对 cahsier 登录进行代码验证。这必须在 Netbeans IDE (GUI) 中用 Java 编码

我的观点只是一个问题,因为你的问题需要你对Java有一个基本的了解。我不确定您是将登录详细信息存储在数据库中还是文本文件中。如果将数据存储在数据库中,则可以使用下面描述的常规 Java 验证技术:

  1. 从收银员处获取用户名和密码。
  2. 数据库中选择与您在上面输入的用户名和密码匹配的记录。
  3. 如果匹配的记录数为零,请打印消息。
  4. 如果输入的记录与数据库中存储的记录匹配,请登录收银员。 有关使用 java 连接到数据库和存储/检索用户数据的更多信息,请参阅此处。

另外,请注意,银行应用程序应该更安全,因此最佳做法是存储密码的种子哈希并使用加密强哈希函数。

如果您要将数据保存在文本文件中,则可以参考此示例代码。您可以在此处阅读有关 Java Scanner 类的更多信息。您还可以决定使用地图在注册时映射所有用户,然后只需检查地图以确认登录详细信息。

N/B:在所有这些情况下,请在提交详细信息之前检查用户名和密码字段是否为空。

如果这是一个真正的应用程序,您将在磁盘上存储用户名和密码的哈希和加盐版本(或者您将通过网络查询它们),理想情况下使用 bcrypt、pbkdf2 或其他强大且可升级的密码哈希方案。有多个开源库可以为您实现这些。

由于这似乎是一个编程练习,因此如何存储它们的问题可能是由编写它的人授权的,因此安全性可能很低。

实现这一点的最简单方法(根本不安全)是保留密码文件。例如,您可以使用类似于以下代码的内容:

public class InsecurePasswordStore {
private Map<String, String> passwords = new HashMap<>();
public void setPassword(String user, String password) {
passwords.put(user, password);
}
public boolean isPasswordCorrect(String user, String password) {
return passwords.get(user) != null && passwords.get(user).equals(password);
}
public void save(File file) throws IOException {
try (PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(file)))) {
for (Map.Entry<String, String> e: passwords.entrySet()) {
writer.println(e.getKey());
writer.println(e.getValue());
}
}
}
public void load(File file) throws IOException {
passwords.clear();
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
boolean finished = false;
while ( ! finished) {
String user = reader.readLine();
String password = reader.readLine();
if (user == null || password == null) {
finished = true;
} else {
passwords.put(user, password);
}
}
}
}
public static void main(String[] args) throws IOException {
InsecurePasswordStore store = new InsecurePasswordStore();
File passwordFile = new File("secrets.txt");
// create initial password file before first run
store.setPassword("manager", "12345");
store.save(passwordFile);
// load file when the app is launched
store.load(passwordFile);
// check password for a user
String badGuess = "2345";
System.out.println("Is " + badGuess
+ " the correct password for the manager? " + store.isPasswordCorrect("manager", badGuess));
String goodGuess = "12345";
System.out.println("Is " + goodGuess
+ " the correct password for the manager? " + store.isPasswordCorrect("manager", goodGuess));
// if the password was correct, set another username-password pair
if (store.isPasswordCorrect("manager", goodGuess)) {
store.setPassword("cashier", "abcde");
}
store.save(passwordFile);
}
}

我的回答更多的是一系列问题和建议,让你思考如何做到这一点。另外,我不能非常具体,因为你在你的问题中提供了很少的细节。

问题1,您的经理输入收银员详细信息后,您将它们存储在哪里?在记忆中?在文件中?在数据库中?别的?

问题 2,在验证收银员登录时,为什么根据该数据库/文件/内存存储验证收银员详细信息?答案是您应该根据存储位置验证收银员登录信息。

此外,无论它的价值如何,您都不应该将登录(例如管理器)硬编码到应用程序中(甚至不用于测试)。为什么?

  1. 如果不发布新版本的软件,就无法摆脱它。
  2. 这是一种安全风险(由于原因 1)。
  3. 如果您在测试中执行此操作,则完全有可能在代码发布之前忘记删除它。那么原因 2 适用。
  4. 没有必要 - 您只需在发行版中使用代表管理器登录名和默认密码(理想情况下带有"密码已过期"指示)的单个记录"播种"您的用户存储,或者如果您有安装程序,则提示执行设置的人员在安装过程中创建管理器登录。

因此,您验证经理凭据的方式将与其他人完全相同。

这将(应该)具有更简单的程序的优势,该程序将更容易维护。

为了以防万一,您区分经理、收银员、主管或您可能拥有(或将来需要)的任何其他用户类型的方式是通过角色。在用户数据存储中,有一个字段定义用户所处的角色(例如经理、收银员等)。另一个模型是"多字段",您可以在其中指示用户具有该角色(从而访问与否)。例如,您可能有经理、主管、收银员、后台等角色。然后,只需在用户记录中输入一个 true/false,指示该用户是否可以访问与特定角色关联的功能。

最后,你的程序变得更简单,因为你的逻辑现在很简单

if user has manager role then display manager menu
if user has supervisor role then display supervisor menu"
etc

请注意,上述伪代码中没有else

最新更新