角色模型

CabloyJS的角色体系基于网上流行的RBAC模型,同时做了以下增强:

  1. 树形结构:将角色扩展为树形结构,并将部门、岗位、职位的概念也整合到角色树中,从而便于实现更灵活的数据授权

  2. 更广的应用范围:角色体系可以应用到更多的资源授权。菜单仅仅是其中一种资源

  3. 数据范围授权:支持企业级业务开发中数据范围授权的问题。比如,Mike是软件部的员工,只能查看自己的数据;Jone是软件部经理,可以查看本部门的数据;Jimmy是企业负责人,可以查看整个企业的数据

概念辨析

涉及到角色体系,往往会有这些概念:用户用户组角色部门岗位授权对象等等

而CabloyJS设计的角色体系只有用户角色授权对象等概念,概念精简,层次清晰,灵活高效,既便于理解,又便于维护

部门即角色

部门从本质上来说,其实就是角色,如:软件部财务部等等

岗位即角色

岗位从本质上来说,其实也就是角色,如:软件部经理软件部设计岗软件部开发岗等等

数据范围即角色

数据范围也是角色。如:Jone是软件部经理,可以查看软件部的数据。其中,软件部就是数据范围

角色树

CabloyJS针对各类业务开发的需求,提炼了一套内置角色,并形成一个规范的角色树。实际开发中,可通过对角色树的扩充和调整,实现各类角色相关的需求

  • root
    • anonymous
    • authenticated
      • template
        • system
      • registered
      • activated
      • superuser
      • organization
        • internal
        • external
名称 说明
root 角色根节点,包含所有角色
anonymous 匿名角色,凡是没有登录的用户自动归入匿名角色
authenticated 认证角色
template 模版角色,可为模版角色配置一些基础的、通用的权限
system 系统模版角色
registered 已注册角色
activated 已激活角色
superuser 超级用户角色,如用户root属于超级用户角色
organization 组织角色
internal 内部组织角色,如可添加软件部财务部等子角色
external 外部组织角色,可为合作伙伴提供角色资源

角色superuser聚合了角色system。所以,对于一些基础的权限,我们往往是给角色system授权;这样,角色superuser也就拥有了相应的授权;进而,用户root也就拥有了这些授权

术语规范

角色是面向业务系统开发最核心的功能之一,CabloyJS提供了既简洁又灵活的角色体系,为便于交流与开发,CabloyJS对其中用到的术语规范如下:

目录角色

  • 目录角色:凡是可以包含子角色的角色,如authenticatedorganization软件部

  • 目录角色不允许添加用户

叶角色

  • 叶角色:角色树的最末端,如superuser软件部设计岗

  • 只有叶角色才允许添加用户

子角色

  • 子角色:既可以是目录角色,也可以是叶角色

聚合角色

  • 聚合角色不是一种角色名称,而是体现了角色之间的一种关系。一般情况下,角色树体现的是纵向的从上至下的继承关系,还可以让一种角色横向的聚合另一种角色

  • 通过聚合角色机制,很容易实现类似角色模版的功能

数据范围

  • 特指在进行原子授权时,权限所限定的角色范围

角色结构重建

为了提升运行性能,CabloyJS对角色树进行了优化处理。所以,如果角色树结构发生了变动,就需要执行角色结构重建,以便对角色树重新优化

  • 在新版CabloyJS中,如果角色树结构发生了变动,会自动进行重建

相关API

1. 查询角色树状态

  1. 1const dirty = await this.ctx.bean.role.getDirty();

2. 使用代码重建

  1. 1await this.ctx.bean.role.build();