Java 控制台用户登录系统(支持角色权限与自定义异常处理)
题目
1、现在有一个文件users.txt,该文件中保存了用户的基本信息
zhangsan : 123456 : admin
lisi : 123456:hr
wangwu : 123456 : emp
zhaoliu : 123456 : manager
2、要求编写一个程序,模拟用户登录的效果。从键盘中输入用户名和密码的数据。如果数据在users.txt就表示登录成功。并展示每个角色
【基本功能】
【可以创建一个自定义异常,该异常表示用户名密码错误】
【可以创建一个自定义异常,该异常表示用户名不存在】
3、对于角色可以使用枚举进行定义。
超级管理员:可以操作所有功能。
hr:招聘、开除、协调各个部门的员工。
emp(普通员工):只能操作自己本部门的一些数据。
manager:管理本部分的所有员工。
实现
项目结构
UserLoginSystem/
├── src/
│ └── com/example/
│ ├── Main.java
│ ├── User.java
│ ├── Role.java
│ ├── AuthService.java
│ ├── exception/
│ │ ├── UserNotFoundException.java
│ │ └── PasswordErrorException.java
├── user.txt
代码
users.txt (放在项目根目录)
zhangsan : 123456 : admin
lisi : 123456 : hr
wangwu : 123456 : emp
zhaoliu : 123456 : manager
Role.java(使用枚举定义角色功能)
package com.example;public enum Role {admin("超级管理员: 可以操作所有功能"),hr("HR: 招聘、开除、协调各个部门的员工"),emp("普通员工: 只能操作自己本部门的一些数据"),manager("经理: 管理本部分的所有员工");private final String description;Role(String description) {this.description = description;}public String getDescription() {return description;}
}
User.java(用户对象)
package com.example;public class User {private String username;private String password;private Role role;public User(String username, String password, Role role) {this.username = username;this.password = password;this.role = role;}public String getUsername() { return username; }public String getPassword() { return password; }public Role getRole() { return role; }
}
UserNotFoundException.java (自定义异常类)
package com.example.exception;public class UserNotFoundException extends Exception {public UserNotFoundException(String message) {super(message);}
}
PasswordErrorException.java(同上)
package com.example.exception;public class PasswordErrorException extends Exception {public PasswordErrorException(String message) {super(message);}
}
AuthService.java(登录验证服务)
package com.example;import com.example.exception.*;import java.io.*;
import java.util.*;public class AuthService {private static final String USER_FILE = "users.txt";private Map<String, User> userMap = new HashMap<>();public AuthService() throws IOException {loadUsers();}private void loadUsers() throws IOException {BufferedReader reader = new BufferedReader(new FileReader(USER_FILE));String line;while ((line = reader.readLine()) != null) {String[] parts = line.split(":");if (parts.length == 3) {String username = parts[0].trim();String password = parts[1].trim();String roleStr = parts[2].trim();Role role = Role.valueOf(roleStr);userMap.put(username, new User(username, password, role));}}reader.close();}public User login(String username, String password)throws UserNotFoundException, PasswordErrorException {if (!userMap.containsKey(username)) {throw new UserNotFoundException("用户不存在!");}User user = userMap.get(username);if (!user.getPassword().equals(password)) {throw new PasswordErrorException("密码错误!");}return user;}
}
Main.java(主函数:用户输入 → 登录 → 权限展示)
package com.example;import com.example.exception.*;import java.io.IOException;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);try {AuthService authService = new AuthService();System.out.print("请输入用户名:");String username = scanner.nextLine();System.out.print("请输入密码:");String password = scanner.nextLine();User user = authService.login(username, password);System.out.println("登录成功,欢迎您:" + user.getUsername());System.out.println("您的权限描述是:" + user.getRole().getDescription());} catch (UserNotFoundException | PasswordErrorException e) {System.out.println("登录失败:" + e.getMessage());} catch (IOException e) {System.out.println("读取用户数据失败:" + e.getMessage());} finally {scanner.close();}}
}
运行结果
知识点
一、文件读写(IO 流)
使用 BufferedReader
+ FileReader
读取 users.txt
文件内容。
掌握读取本地文件的方法:readLine()
+ split()
拆分用户信息。
使用 close()
释放资源,或可升级为 try-with-resources
。
相关类/方法:
BufferedReader reader = new BufferedReader(new FileReader("users.txt")); String line = reader.readLine(); reader.close();
二、字符串处理
使用 String.split(":")
分割字符串。
使用 trim()
清除多余空格,避免解析错误。
熟练处理用户输入与文件读取内容的对比逻辑。
三、集合(Map)
使用 HashMap<String, User>
存储用户名与对应的 User
对象,实现快速查找。
体现了数据结构在登录校验中的实际应用。
示例:
Map<String, User> userMap = new HashMap<>(); userMap.put("zhangsan", userObj);
四、枚举(enum
)
使用枚举 Role
表示用户角色,并封装每种角色的功能描述。
提高代码可读性与可维护性,替代了硬编码字符串。
示例:
public enum Role { admin("超级管理员"), emp("普通员工") // ... }
五、面向对象设计(OOP)
使用 User
类封装用户信息(用户名、密码、角色)。
使用 AuthService
类封装登录逻辑,实现模块化设计。
使用封装(private 成员 + public getter)、构造方法、对象之间的组合。
六、自定义异常类(Exception Handling)
UserNotFoundException
:表示用户不存在。
PasswordErrorException
:表示密码错误。
在 login()
中抛出自定义异常,在 main()
中用 try-catch
捕获并处理。
示例:
throw new UserNotFoundException("用户不存在!"); catch (UserNotFoundException e) { ... }
七、控制台交互(Scanner)
使用 Scanner
获取用户输入的用户名与密码。
示例:
Scanner scanner = new Scanner(System.in); String username = scanner.nextLine();