Skip to content

权限与操作记录

权限和操作记录由授权抽象层与操作记录模块共同提供。Service 通过 PermissionResource 声明资源,通过 PermissionAction 声明动作,通过 OperLogEntityOperLog 声明操作记录元数据。

权限码格式

标准格式:

text
{module}:{entity}:{action}

示例:

text
system:user:query
system:user:add
system:user:edit
system:user:remove
monitor:operlog:query

当前服务层推荐使用统一动作:

动作含义
query查询、详情、下拉、树等读操作
add新增、上传、创建等写入操作
edit编辑、状态变更、同步等更新操作
remove删除、清空等移除操作
export导出操作
import导入操作

权限解析顺序

接口权限准入顺序:

  1. [AllowAnonymous] 放行。
  2. [IgnorePermission] 放行。
  3. ABP [RemoteService(false)] 禁用的接口放行。
  4. 命中 PermissionOptions.WhitelistActions 放行。
  5. 显式 [Permission("...")],校验指定权限码。
  6. 自动推断出权限码时,根据 AutoCheckResolvedActions 决定是否校验。
  7. 未能推断权限码时,根据 AllowUnresolvedActions 决定放行或 403。

Service 权限配置

声明资源

在应用服务类上使用 [PermissionResource] 声明模块码和资源码:

csharp
[PermissionResource("system", "file")]
[OperLogEntity("文件")]
public class FileService : YiCrudAppService<FileAggregateRoot, FileGetListOutputDto, Guid, FileGetListInputVo>
{
}

资源声明后,方法动作会组合为:

text
system:file:{action}

例如:

text
system:file:query
system:file:add
system:file:remove

声明动作

新增代码推荐使用 PermissionActionEnum,避免裸字符串拼写错误:

csharp
[PermissionAction(PermissionActionEnum.Query)]
public async Task<FileStreamResult> DownloadAsync(Guid id)
{
}

常用枚举:

枚举输出动作
PermissionActionEnum.Queryquery
PermissionActionEnum.Addadd
PermissionActionEnum.Editedit
PermissionActionEnum.Removeremove
PermissionActionEnum.Exportexport
PermissionActionEnum.Importimport

字符串构造方式仍可兼容历史代码,但新增功能优先使用枚举。

CRUD 基类

继承 YiCrudAppService 的标准 CRUD 方法会带有统一动作语义。业务服务只需要在类上声明资源和操作记录实体:

csharp
[PermissionResource("system", "tenantPackage")]
[OperLogEntity("租户套餐")]
public class TenantPackageService : YiCrudAppService<TenantPackageAggregateRoot, TenantPackageGetOutputDto, TenantPackageGetListOutputDto, Guid,
    TenantPackageGetListInputVo, TenantPackageCreateInputVo, TenantPackageUpdateInputVo>
{
}

对非标准方法,应显式声明动作:

csharp
[PermissionAction(PermissionActionEnum.Query)]
public async Task<MenuTreeResultDto> GetMenuTreeAsync(Guid? packageId)
{
}

自动推断规则

模块名目前基于命名空间推断:

命名空间模块码
Yi.Module.Rbac.*system
Yi.Module.TenantManagement.*system
Yi.Module.SettingManagement.*system
Yi.Module.AuditLogging.*monitor

实体名来自服务类名,去掉 Service 后转小写:

text
UserService -> user
OperationLogService -> operationlog

标准方法动作映射:

方法action
GetListAsync / GetSelectDataListAsync / GetAsyncquery
CreateAsync / Post*add
UpdateAsync / Put*edit
DeleteAsync / Delete* / Remove* / Clear*remove
ExportAsync / GetExportExcelAsyncexport
ImportAsync / PostImportExcelAsyncimport

兼容说明

如果历史菜单种子中存在自定义权限码,例如 resetPwd,应通过显式 [Permission] 或配置映射保持兼容。新增功能建议使用统一动作。

显式权限

当自动推断不满足需求时,在方法上声明:

csharp
[Permission("system:user:query")]
public override async Task<PagedResultDto<UserGetListOutputDto>> GetListAsync(UserGetListInputVo input)
{
}

显式权限优先级最高。

忽略权限

类或方法上使用 [IgnorePermission] 可跳过权限检查:

csharp
[IgnorePermission]
public async Task<LoginOutputDto> LoginAsync(LoginInputVo input)
{
}

配置映射

appsettings.json 中可以配置权限映射:

json
{
  "Operation": {
    "Permission": {
      "AutoCheckResolvedActions": true,
      "AllowUnresolvedActions": true,
      "WhitelistActions": [],
      "Mappings": {
        "Yi.Module.Rbac.Application.Services.System.UserService.ResetPasswordAsync": "system:user:resetPwd"
      }
    }
  }
}

映射优先级低于 [Permission],高于自动推断。

操作记录

操作记录同样使用 Service 的 Action 元数据。

类上可以声明实体显示名:

csharp
[OperLogEntity("文件")]
public class FileService : ApplicationService
{
}

方法上可以显式声明日志标题和操作类型:

csharp
[OperLog("添加用户", OperEnum.Insert)]
public override async Task<UserGetOutputDto> CreateAsync(UserCreateInputVo input)
{
}

如果没有显式 [OperLog],系统会根据 action 和 [OperLogEntity] 推断日志类型和标题。

对于特殊业务动作,建议显式声明:

csharp
[PermissionAction(PermissionActionEnum.Edit)]
[OperLog("同步租户套餐", OperEnum.Update)]
public async Task SyncPackageAsync(Guid tenantId, Guid packageId)
{
}

前端按钮权限

前端按钮权限使用后端返回的 permissionCodes

vue
<a-button v-access:code="['system:user:add']">新增</a-button>

登录后 getUserInfoApi() 返回用户、角色码和权限码,前端会写入 accessStore.accessCodes

相关文档

贡献者

The avatar of contributor named as dubai dubai
The avatar of contributor named as wcg wcg

页面历史

基于 MIT 许可发布.