C#上位机实现权限管理

C# 上位机权限管理(工控场景落地方案)

核心思路:用户 + 角色 + 权限 三层架构,贴合工控场景(操作员 / 工程师 / 管理员),可直接集成到 WinForm/WPF 项目✅先给可落地核心方案,再附关键代码

一、三层核心架构(必做)

工控场景最优解,易扩展、好维护

  1. 权限:绑定具体操作(如参数修改、程序下载、报警清除、配方管理)
  2. 角色:预设 3 类(适配工控),批量分配权限
    • 操作员:仅监控、启停,无修改权
    • 工程师:可参数修改、配方编辑,无系统配置权
    • 管理员:全权限 + 用户管理
  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 种方案适配工控)

  1. 轻量方案(单机上位机):用XML/Json文件存储用户、角色、权限,无需数据库
  2. 专业方案(多机联网):用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"));

三、工控场景优化要点(避坑)

  1. 密码加密:绝对不存明文,用MD5/SHA256加密,示例:

    cs 复制代码
    public static string Md5Encrypt(string str) => BitConverter.ToString(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(str))).Replace("-", "");
  2. 自动登出:工控机长时间无人操作,定时调用AuthManager.Logout(),避免权限泄露

  3. 日志记录:关键权限操作(如改参数、下程序)记录日志,方便追溯

  4. 角色不可删:操作员、管理员角色默认保留,仅可修改权限,避免误删导致无权限登录

WinForm 权限管理 Demo ,里面包含:登录、用户 / 角色 / 权限、菜单和按钮权限控制,用 JSON 做本地存储,复制项目结构就能用。

相关推荐
古城小栈1 天前
rust 借用,三巨头之一
开发语言·rust
小北方城市网1 天前
第 9 课:Python 全栈项目性能优化实战|从「能用」到「好用」(企业级优化方案|零基础落地)
开发语言·数据库·人工智能·python·性能优化·数据库架构
superman超哥1 天前
Rust 内存泄漏检测与防范:超越所有权的内存管理挑战
开发语言·后端·rust·内存管理·rust内存泄漏
悟能不能悟1 天前
java HttpServletRequest 设置header
java·开发语言
云栖梦泽1 天前
易语言运维自动化:中小微企业的「数字化运维瑞士军刀」
开发语言
工藤新一OL1 天前
如何做COM组件
c#·visual studio
刘97531 天前
【第23天】23c#今日小结
开发语言·c#
郝学胜-神的一滴1 天前
线程同步:并行世界的秩序守护者
java·linux·开发语言·c++·程序人生
superman超哥1 天前
Rust 移动语义(Move Semantics)的工作原理:零成本所有权转移的深度解析
开发语言·后端·rust·工作原理·深度解析·rust移动语义·move semantics