NetBeans收银系统权限控制求助:仅管理员可访问Inventario模块
问题分析与解决方案
一、现有问题根源
1. getTipoUsuario()返回null的原因
- 登录流程中未将当前用户的
tipoUsuario字段正确存入usu对象,比如验证通过后只赋值了id_usuario,遗漏了用户类型;或者usu是新创建的空实例,而非登录时获取的完整用户对象。 - 直接调用
tUsuario.equals("admin")存在空指针风险,应优先用常量比较,即"admin".equals(tUsuario)。
2. 始终返回第一个用户类型的原因
ListarUsuario.get(tID)是把用户ID当作列表索引使用,但列表索引从0开始递增,而数据库中id_usuario通常是从1开始的自增ID,二者不匹配。比如用户ID为1时,会取到列表索引1的元素(实际是第二个用户),若ID大于列表长度还会触发数组越界异常。
二、可行的权限判断方案
最优方案:全局存储登录用户信息
登录验证通过时,将完整的用户对象存入全局可访问的变量(比如主窗体的成员变量),后续直接用该对象做权限判断:
1. 登录环节完善
// 登录验证逻辑(结合你的DAO实现) String username = txtUsuario.getText(); String password = txtContrasena.getText(); Login currentUser = loginDAO.validarCredenciales(username, password); // 此方法需返回包含tipoUsuario的完整用户对象 if (currentUser != null) { // 将用户对象存入全局变量(比如MainFrame的成员变量) this.loggedUser = currentUser; // 跳转主界面 new MainFrame(loggedUser).setVisible(true); this.dispose(); } else { JOptionPane.showMessageDialog(this, "用户名或密码错误"); }
2. 库存按钮的权限判断
// 在MainFrame的库存按钮点击事件中 if (loggedUser != null && "admin".equals(loggedUser.getTipoUsuario())) { LimpiarTable(); ListarArticulo(); jTabbedPane1.setSelectedIndex(1); } else { JOptionPane.showMessageDialog(this, "仅管理员可访问库存模块"); }
备选方案:数据库查询匹配(不推荐)
若无法全局存储用户对象,需通过用户ID遍历列表匹配,而非用ID当索引:
List<Login> usuarioList = usuarios.ListarUsuarios(); String userRole = null; int targetUserId = usu.getId_usuario(); // 遍历列表找到对应ID的用户 for (Login user : usuarioList) { if (user.getId_usuario() == targetUserId) { userRole = user.getTipoUsuario(); break; } } if ("admin".equals(userRole)) { LimpiarTable(); ListarArticulo(); jTabbedPane1.setSelectedIndex(1); } else { JOptionPane.showMessageDialog(this, "无访问权限"); }
三、额外优化建议
- 定义用户类型常量,比如
public static final String ROLE_ADMIN = "admin";,避免硬编码字符串,减少拼写错误。 - 登录后直接控制界面元素:销售员登录时,将库存按钮设置为
btnInventario.setEnabled(false),从根源避免无权限点击。
内容的提问来源于stack exchange,提问作者Ukantor
相关产品推荐
相关产品推荐

