角色管理
功能概述
角色管理模块用于维护系统角色信息,支持角色的增删改查,以及菜单与功能权限、数据项权限(行级)、数据列权限(列级)的分配,和角色用户的管理。
角色是 RBAC(基于角色的访问控制)的核心,权限通过角色间接分配给用户。
操作说明
查询角色
- 登录系统后,在菜单中选择 系统管理 → 角色管理
- 在顶部输入关键字,点击 查询 按钮筛选角色
添加角色
- 点击工具栏的 添加 按钮
- 在表格中直接编辑新行:填写角色名称和描述
- 新角色的默认值:角色ID自动生成、创建人自动填入当前用户、状态为正常(
1) - 点击 保存 提交
编辑角色
直接在表格中双击要编辑的行进行编辑,修改完成后点击 保存。
提示
保存时系统会校验角色名称是否重复,重复则无法保存。
删除角色
- 在表格中选择要删除的角色
- 点击 删除 按钮
- 系统会先调用
CheckBeforeRemoveRole检查该角色是否有关联数据,有关联则需先解除
编辑角色用户
- 在表格中选择一个角色
- 点击 编辑用户 按钮
- 在弹出的窗口中通过 双击数据行 在左右列表之间移动用户
- 点击 确定 保存
列表字段说明
| 界面列名 | 绑定字段 | 可编辑 | 说明 |
|---|---|---|---|
| 角色名称 | CRoleName | 是 | 角色显示名称,保存时校验唯一性 |
| 角色描述 | CDescription | 是 | 角色功能描述 |
| 创建人 | Creator | 否 | 角色创建者 |
| 创建时间 | CreateTime | 否 | 创建时间 |
| 最后修改人 | LastModifier | 否 | 最后修改者 |
| 最后修改时间 | LastModifyTime | 否 | 最后修改时间 |
| 状态 | CState | 否 | 1=正常,0=禁用,2=变更 |
工具栏按钮说明
| 按钮 | 说明 |
|---|---|
| 查询 | 按关键字筛选角色列表 |
| 添加 | 在表格中新增一行角色 |
| 删除 | 删除选中的角色(需先解除关联数据) |
| 保存 | 提交所有增删改操作 |
| 编辑用户 | 管理该角色下的用户分配 |
| 菜单与功能权限 | 分配菜单和按钮功能点权限 |
| 数据项权限 | 分配行级数据访问权限 |
| 数据列权限 | 分配列级数据可见权限 |
菜单与功能权限
设计逻辑
菜单与功能权限控制的是用户能看到哪些菜单、能执行哪些按钮操作。权限数据存储在资源(HmxRes)和角色资源关联表中,通过树形复选框方式管理。
系统加载用户菜单时,根据用户拥有的角色查询已授权的资源列表,过滤出用户可访问的菜单树;框架加载窗体组件时,根据角色授权的功能点自动隐藏没有权限的按钮。
操作说明
- 在角色列表中选择一个角色,点击 菜单与功能权限 按钮
- 弹出
角色[角色名]的菜单与功能权限编辑窗口 - 顶部 分组 下拉选择命名空间(如
TDWEB、TDMOB),筛选对应端的菜单 - 树形列表展示所有菜单和功能点,每个节点带复选框
复选框状态:
| 状态 | 含义 |
|---|---|
| ☑️ 已勾选 | 该资源已授权给当前角色 |
| ⬜ 未勾选 | 该资源未授权 |
| ➖ 半选(Indeterminate) | 子节点部分勾选 |
操作方式:
- 勾选父节点会 级联勾选 所有子节点
- 取消勾选父节点会 级联取消 所有子节点
- 已勾选的节点会自动展开其父节点
- 点击 确定 保存当前分组的权限配置
注意
切换分组(命名空间)时,权限树会重新加载。每个分组的权限需要 分别保存。
菜单节点 vs 功能点节点
| 类型 | 图标 | 说明 |
|---|---|---|
| 菜单(Menu) | 菜单对应图标(由 CIcon 决定) | 控制用户能否在导航栏看到并进入该页面 |
| 功能点(Widget) | 按钮图标 | 控制用户能否执行页面内的具体操作(如新增、删除) |
功能点挂在菜单下面,勾选菜单只代表能访问页面,还需要勾选具体的功能点才能操作对应的按钮。
权限生效原理
WinForm 端: 框架通过 ViewControlExecutor_SimpleButton 自动处理——窗体加载时检查 HasPermission(窗体, 按钮Name) ,没有权限则设置 btn.Visible = false。
Web 端: 前端通过 v-hp="'功能点编码'" 权限指令控制按钮的显示/隐藏。
数据项权限(行级)
设计逻辑
数据项权限控制的是用户能看到哪些数据行。例如:某角色只能看到"华东区"的订单,或只能看到"本部门"的员工。
权限数据存储在受限数据资源表和角色数据项关联表中。数据资源定义了"对哪张表的哪些行做权限控制",角色数据项关联表记录了"某个角色可以访问该表中的哪些行"。
系统查询数据时,框架会根据当前用户的角色自动追加 WHERE 条件,过滤出用户有权访问的数据行。
界面布局
窗口标题:RBAC角色资源权限管理(数据项)
| 区域 | 说明 |
|---|---|
| 左侧面板 | 受限数据资源列表(已注册的数据表) |
| 右侧面板 | 当前角色拥有的数据项(勾选框列表) |
| 工具栏 | 查询、添加、删除 |
受限数据资源列表字段:
| 列名 | 说明 |
|---|---|
| 受限数据 | 资源编码(对应数据库表名) |
| 受限数据名称 | 资源显示名称 |
| 主键列 | 该表的主键字段名 |
| 名称列 | 该表的显示名称字段 |
右侧数据项字段:
| 列名 | 说明 |
|---|---|
| 选择 | 勾选框,勾选表示该角色可以访问此数据行 |
| 编码 | 数据行的主键值 |
| 描述 | 数据行的显示名称 |
操作说明
- 在角色列表中选择一个角色,点击 数据项权限 按钮
- 左侧面板显示已注册的受限数据资源
- 点击某个受限数据资源,右侧面板加载该资源下所有数据行
- 勾选 需要授权的数据行(勾选即保存,实时生效)
- 取消勾选 即收回该数据行的访问权限
添加受限数据资源
- 点击 添加 按钮,弹出受限数据资源编辑窗口
- 填写以下字段:
| 界面标签 | 说明 |
|---|---|
| 搜索关键字 | 输入关键词搜索数据库中的表 |
| 表 | 从搜索结果中选择要控制的表 |
| 资源名称 | 该受限数据资源的显示名称 |
| 主键列 | 选择该表的主键字段(用于标识每一行) |
| 名称列 | 选择该表的显示名称字段(用于展示数据行) |
| 点击 确定 | 完成添加 |
- 添加后,该表会出现在左侧列表中,可以为其分配角色数据项权限
删除受限数据资源
- 在左侧列表中选择要删除的受限数据资源
- 点击 删除 按钮
- 如果该资源已经分配了权限,系统会提示确认——删除后相关角色的行级权限将失效
注意
删除受限数据资源会同时删除所有角色对该资源的权限分配,请谨慎操作。
权限生效原理
系统查询数据时,RestrictDataAppService 根据用户角色查询已授权的数据项,自动在查询语句中追加 WHERE 主键 IN (已授权列表) 条件。如果用户没有任何角色或角色未分配数据项权限,则无法看到该资源下的数据。
数据列权限(列级)
设计逻辑
数据列权限控制的是用户能看到哪些数据列。例如:某角色看不到"薪资"列,或看不到"身份证号"列。
权限数据存储在资源表(HmxRes,类型为 DataColumn)和角色数据列关联表中。每个数据列权限对应一个实体类,勾选的属性名即为用户可读写的列。
系统加载表格时,框架根据角色授权的列权限自动隐藏未授权的列。
界面布局
窗口标题:当前角色[角色名]可读写列:
| 区域 | 说明 |
|---|---|
| 左侧面板 | 数据列权限资源列表(已注册的实体类) |
| 右侧面板 | 该实体类的所有属性列表(复选框) |
| 工具栏 | 查询、添加、删除、保存 |
左侧资源列表字段:
| 列名 | 绑定字段 | 说明 |
|---|---|---|
| 资源编码 | CCode | 实体类的完整命名空间路径(如 Hmx.Service.Admin.Entities.HmxUser) |
| 标题 | CTitle | 实体类名称 + Description 特性描述 |
| 启用 | CEnable | 是否启用 |
右侧属性列表字段:
| 列名 | 说明 |
|---|---|
| ☑️ 复选框 | 勾选表示该角色可以读写此列 |
| 属性名 | 实体类的属性名 + Description 特性描述 |
操作说明
- 在角色列表中选择一个角色,点击 数据列权限 按钮
- 左侧面板自动加载所有已注册的实体类(通过
ITypeFinder扫描IHmxEntity的实现类) - 点击某个实体类,右侧面板通过 反射 读取该实体类的所有公开属性,显示为复选框列表
- 已授权的列自动勾选
- 勾选或取消勾选 即时生效(
CellValueChanged/ItemCheck事件实时保存)
添加数据列权限资源
- 点击 添加 按钮
- 在新增行中填写:
- 资源编码(CCode):实体类的完整命名空间路径(如
Hmx.Service.Admin.Entities.HmxUser) - 标题(CTitle):显示名称
- 资源编码(CCode):实体类的完整命名空间路径(如
- 点击 保存 提交
删除数据列权限资源
- 在左侧列表中选择要删除的资源
- 点击 删除 按钮
- 如果该资源已分配了列权限,系统会提示确认——删除后相关角色的列级权限将失效
注意
保存时系统会校验资源编码是否重复,重复则无法保存。删除资源会同时删除所有角色对该资源的列级权限。
权限生效原理
系统加载表格时,RestrictDataAppService 根据用户角色查询已授权的列名列表,框架自动隐藏未在授权列表中的列。未被勾选的列对用户不可见,但数据仍然存在于后端,只是界面上不展示。
三级权限的关系
用户
└── 角色(可多个)
├── 菜单与功能权限 → 控制 能访问哪些页面、能执行哪些按钮
├── 数据项权限 → 控制 能看到哪些数据行
└── 数据列权限 → 控制 能看到哪些数据列三种权限相互独立、可以任意组合。例如:某角色可以访问"订单管理"页面(菜单权限),但只能看到"华东区"的订单(数据项权限),且看不到"成本价"列(数据列权限)。