C# 上位机权限管理(工控场景落地方案)
核心思路:用户 + 角色 + 权限 三层架构,贴合工控场景(操作员 / 工程师 / 管理员),可直接集成到 WinForm/WPF 项目✅先给可落地核心方案,再附关键代码
一、三层核心架构(必做)
工控场景最优解,易扩展、好维护
- 权限:绑定具体操作(如参数修改、程序下载、报警清除、配方管理)
- 角色:预设 3 类(适配工控),批量分配权限
- 操作员:仅监控、启停,无修改权
- 工程师:可参数修改、配方编辑,无系统配置权
- 管理员:全权限 + 用户管理
- 用户:绑定 1 个角色,登录验证后加载权限
二、关键落地步骤(4 步搞定)
1. 定义核心实体类(直接复制用)
cs
// 权限实体(绑定功能编码,工控用编码更稳定)
public class Permission
{
public int Id { get; set; }
public string Code { get; set; } // 如"ParamEdit""PlcDownload""UserManage"
public string Name { get; set; } // 权限名称
}
// 角色实体
public class Role
{
public int Id { get; set; }
public string Name { get; set; } // 操作员/工程师/管理员
public List<Permission> Permissions { get; set; } = new();
}
// 用户实体
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public string Password { get; set; } // 建议存MD5加密串,不要明文
public Role UserRole { get; set; }
public bool IsActive { get; set; } = true; // 是否启用
}
2. 权限验证核心工具类(全局调用)
cs
// 全局权限管理类,登录后缓存当前用户和权限
public static class AuthManager
{
// 当前登录用户
public static User CurrentUser { get; private set; }
// 登录验证
public static bool Login(string userName, string password, List<User> userList)
{
var user = userList.FirstOrDefault(u => u.UserName == userName
&& u.Password == password // 实际用MD5校验
&& u.IsActive);
if (user != null)
{
CurrentUser = user;
return true;
}
return false;
}
// 核心:权限校验(工控场景高频调用)
public static bool HasPermission(string permCode)
{
return CurrentUser != null
&& CurrentUser.UserRole != null
&& CurrentUser.UserRole.Permissions.Any(p => p.Code == permCode);
}
// 退出登录
public static void Logout() => CurrentUser = null;
}
3. 工控场景 2 种权限控制(项目必用)
✅ 方式 1:控件显隐 / 禁用(最常用)
登录后自动控制按钮、菜单是否可用,贴合工控操作习惯
cs
// 窗体加载时初始化权限(放在MainForm_Load事件)
private void InitPermission()
{
// 参数修改按钮:仅工程师/管理员可见可用
btnParamEdit.Visible = AuthManager.HasPermission("ParamEdit");
btnParamEdit.Enabled = AuthManager.HasPermission("ParamEdit");
// PLC程序下载:仅管理员可用
btnPlcDownload.Enabled = AuthManager.HasPermission("PlcDownload");
// 用户管理菜单:仅管理员可见
menuUserManage.Visible = AuthManager.HasPermission("UserManage");
}
✅ 方式 2:功能方法拦截(防绕过控件操作)
关键操作(如写 PLC、改配方)加权限校验,避免用户通过快捷键 / 代码绕过控件
cs
// 示例:修改工艺参数(工控核心操作)
private void SaveParam()
{
if (!AuthManager.HasPermission("ParamEdit"))
{
MessageBox.Show("无参数修改权限,请联系管理员!", "权限不足",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
// 后续写PLC/存数据库逻辑...
}
4. 数据存储(2 种方案适配工控)
- 轻量方案(单机上位机):用
XML/Json文件存储用户、角色、权限,无需数据库 - 专业方案(多机联网):用
SQLite/MySQL存储,支持多客户端同步权限
✅ 推荐单机上位机用 Json,读写简单:
cs
// 序列化存储用户列表
var userList = new List<User>(){/* 预设操作员、管理员等 */};
File.WriteAllText("UserAuth.json", JsonConvert.SerializeObject(userList));
// 读取
var userList = JsonConvert.DeserializeObject<List<User>>(File.ReadAllText("UserAuth.json"));
三、工控场景优化要点(避坑)
-
密码加密:绝对不存明文,用
MD5/SHA256加密,示例:cspublic static string Md5Encrypt(string str) => BitConverter.ToString(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(str))).Replace("-", ""); -
自动登出:工控机长时间无人操作,定时调用
AuthManager.Logout(),避免权限泄露 -
日志记录:关键权限操作(如改参数、下程序)记录日志,方便追溯
-
角色不可删:操作员、管理员角色默认保留,仅可修改权限,避免误删导致无权限登录