# 记录操作权限
# 概述
本功能用于实现记录级别的数据操作权限控制,解决应用权限只能控制全部数据或全部不能控制的问题。例如用户可以编辑自己录入的数据,但不能编辑别人录入的数据。
# 一、示例演示:客户名录记录级权限
# 演示路径
- 访问地址:应用中心
- 模块名称:记录操作权限
# 业务处理效果
模块标题:客户名录(仅可编辑自己登记的客户)
数据列表(共3条数据):
- 第1条数据:张三填写
- 第2条数据:李四填写
- 第3条数据:当前登录用户(史蒂夫)填写
权限效果(当前登录用户:史蒂夫):
- 选中史蒂夫填写的数据:编辑按钮亮起(可编辑)
- 选中张三填写的数据:编辑按钮不亮(不可编辑)
- 选中李四填写的数据:编辑按钮不亮(不可编辑)
# 二、实现方法
# 前台代码声明
文件路径:wwwroot\Apps\samples\CustomersRecordEditPermission.js
// 第38行:创建编辑按钮时声明需要记录权限
me.btnEdit = me.createEditBtn({
recordPerm: 'Edit'
});
代码说明:
recordPerm: 'Edit':声明编辑按钮需要记录级权限- 前台只需添加这个参数,即可启用记录级权限控制
# 后台代码实现
文件路径:Web项目\Apps\Controllers\SampleCustomersRecordEditPermisionController.cs
// 第25-31行:重载GetRecordPermisionsAsync实现记录级权限
protected override Task<Dictionary<string, bool>> GetRecordPermisionsAsync(SampleCustomer record, string loginUserAccount)
{
Dictionary<string, bool> rv = new Dictionary<string, bool>();
// 如果数据登记人是当前登录用户,则赋予编辑权限
rv["Edit"] = record.RegisterBy == loginUserAccount;
return Task.FromResult(rv);
}
代码说明:
- GetRecordPermisionsAsync:记录权限处理链中的钩子函数,用于定义记录级权限规则
- 参数record:当前数据记录
- 参数loginUserAccount:当前登录用户账号
- rv["Edit"] = record.RegisterBy == loginUserAccount:定义编辑权限规则
# 配置步骤
- 前台声明:在按钮配置中添加
recordPerm: 'Edit'参数 - 后台重载:重载
GetRecordPermisionsAsync函数 - 定义规则:在函数中为需要的权限(Edit、Delete)定义判断规则
# 关键要点
- 两步完成:只需前台声明和后台重载两个步骤
- 灵活规则:支持任意复杂的权限判断逻辑
- 自动控制:框架自动根据返回值控制按钮状态
# 三、核心原理
# GetRecordPermisionsAsync钩子
| 特性 | 说明 |
|---|---|
| 函数名称 | GetRecordPermisionsAsync |
| 所在位置 | 控制器基类中的虚函数 |
| 调用时机 | 获取记录详情时自动调用 |
| 作用 | 为每条记录生成操作权限 |
# 四、扩展应用
# 复杂权限规则示例
protected override Task<Dictionary<string, bool>> GetRecordPermisionsAsync(
SampleCustomer record,
string loginUserAccount)
{
var rv = new Dictionary<string, bool>();
// 获取当前用户角色
var currentUserRole = GetUserRole(loginUserAccount);
// 编辑权限:本人或管理员可编辑
rv["Edit"] = record.RegisterBy == loginUserAccount || currentUserRole == "Admin";
// 删除权限:本人或部门经理可删除
rv["Delete"] = record.RegisterBy == loginUserAccount || currentUserRole == "Manager";
return Task.FromResult(rv);
}
# 常见应用场景
| 场景 | 权限规则 | 说明 |
|---|---|---|
| 仅自己可编辑 | record.RegisterBy == currentUser | 用户只能编辑自己创建的数据 |
| 本部门可编辑 | record.Department == user.Department | 用户可编辑本部门的数据 |
| 下级可编辑 | record.RegisterBy.In(user.Subordinates) | 领导可编辑下属的数据 |
| 状态控制 | record.Status == "Draft" | 只有草稿状态可编辑 |
# 五、应用权限对比
| 控制类型 | 控制粒度 | 适用场景 | 实现方式 |
|---|---|---|---|
| 应用权限 | 整个模块 | 控制谁能访问模块、谁能增删改 | 资源授权 |
| 记录级权限 | 每条记录 | 控制谁能编辑、删除特定记录 | 重载GetRecordPermisionsAsync |
# 六、注意事项
- 前台声明:需要记录权限的按钮必须添加
recordPerm参数 - 权限名称:权限名称(如Edit、Delete)必须与前台声明的名称一致
- 返回值:返回
true表示有权限,按钮可用;返回false表示无权限,按钮不可用 - 函数重载:确保正确重载
GetRecordPermisionsAsync函数
# 七、总结
记录级数据操作权限的实现非常便捷:
- ✅ 两步完成:前台声明 + 后台重载
- ✅ 粒度精细:可控制每条记录的操作权限
- ✅ 灵活规则:支持任意复杂的权限判断逻辑
- ✅ 自动控制:框架自动根据权限控制按钮状态
通过这种方式,可以轻松实现诸如“只能编辑自己录入的数据”、“只能编辑本部门数据”等常见需求,弥补了应用权限只能控制整个模块的不足。