在前面我们看到API路由可以绑定功能菜单,然后进行功能授权菜单授权。其实,API路由还提供另一种类型的授权:原子授权

原子授权是基于数据的授权。本章节讲述原子授权的基本概念和用法,更详细内容请参见:CabloyJS:原子授权

原子授权与API路由的绑定

核心模块a-base提供了一组API路由,用于集中封装原子相关的功能。比如API路由atom/read,用于读取单条原子数据,其路由配置如下:

node-modules/a-base-sync/backend/src/routes.js

{ method: 'post', path: 'atom/read', controller: atom,
  meta: { right: { type: 'atom', action: 2 } },
},
名称 说明
meta 是路由的元数据,可以指定与中间件相关的参数
right 全局中间件right的参数
type 授权类型,这里是原子授权
action 需要进行授权验证的原子指令代码

我们不关心用户是否有权限访问这条API路由,而是关心用户是否有权限访问相应的原子数据。这就是功能授权原子授权的区别所在

授权内容

针对原子类型原子指令授权,如以下授权记录

角色 原子类型 原子指令
system party create

资源范围授权

在授权时可以指定权限的资源范围,如以下授权记录

角色 原子类型 原子指令 资源范围
system party read 财务部

角色system仅能读取财务部创建的party数据

授权途径

功能授权一样,原子授权也有三种途径。在这里,也通过初始授权途径,给相关的角色分配合适的初始权限

授权记录

角色 原子类型 原子指令 资源范围
system party create
system party write 自己的数据
system party delete 自己的数据
system party read authenticated

授权代码

src/module/test-party/backend/src/service/version.js

async init(options) {
  if (options.version === 4) {
    // add role rights
    const roleRights = [
      { roleName: 'system', action: 'create' },
      { roleName: 'system', action: 'write', scopeNames: 0 },
      { roleName: 'system', action: 'delete', scopeNames: 0 },
      { roleName: 'system', action: 'read', scopeNames: 'authenticated' },
    ];
    await this.ctx.meta.role.addRoleRightBatch({ atomClassName: 'party', roleRights });  
  }
}

原子指令菜单

有两个特别的菜单类型:新建原子原子列表,其权限是与原子权限相关联的。比如,当我们配置了partycreateread原子权限,那么新建party和查看party列表这两个菜单项就会被自动赋予授权

因此,我们需要按如下方式声明这两类菜单项,从而将原子授权菜单授权进行关联:

src/module/test-party/backend/src/meta.js

const meta = {
  base: {
    functions: {
      createParty: {
        title: 'Create Party',
        scene: 'create',
        autoRight: 1,
        atomClassName: 'party',
        action: 'create',
        sorting: 1,
        menu: 1,
      },
      listParty: {
        title: 'Party List',
        scene: 'list',
        autoRight: 1,
        atomClassName: 'party',
        action: 'read',
        sorting: 1,
        menu: 1,
      },
    },
  },
名称 说明
autoRight 设为1,表示是自动授权,与对应的原子授权相关联
atomClassName 对应的原子类型名称
action 对应的原子指令