# 记录操作权限

# 概述

本功能用于实现记录级别的数据操作权限控制,解决应用权限只能控制全部数据或全部不能控制的问题。例如用户可以编辑自己录入的数据,但不能编辑别人录入的数据。

# 一、示例演示:客户名录记录级权限

# 演示路径

  • 访问地址:应用中心
  • 模块名称:记录操作权限

# 业务处理效果

模块标题:客户名录(仅可编辑自己登记的客户)

数据列表(共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:定义编辑权限规则

# 配置步骤

  1. 前台声明:在按钮配置中添加recordPerm: 'Edit'参数
  2. 后台重载:重载GetRecordPermisionsAsync函数
  3. 定义规则:在函数中为需要的权限(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

# 六、注意事项

  1. 前台声明:需要记录权限的按钮必须添加recordPerm参数
  2. 权限名称:权限名称(如Edit、Delete)必须与前台声明的名称一致
  3. 返回值:返回true表示有权限,按钮可用;返回false表示无权限,按钮不可用
  4. 函数重载:确保正确重载GetRecordPermisionsAsync函数

# 七、总结

记录级数据操作权限的实现非常便捷:

  • 两步完成:前台声明 + 后台重载
  • 粒度精细:可控制每条记录的操作权限
  • 灵活规则:支持任意复杂的权限判断逻辑
  • 自动控制:框架自动根据权限控制按钮状态

通过这种方式,可以轻松实现诸如“只能编辑自己录入的数据”、“只能编辑本部门数据”等常见需求,弥补了应用权限只能控制整个模块的不足。