资源授权

资源授权主要解决这类问题:能访问后端的哪个资源

- 授权策略

CabloyJS采用白名单策略,所有角色的授权都必须显式设置(superuser也不例外)

- 授权内容

针对资源的授权,如以下授权记录:

角色 资源
system test-party:kitchenSink

通过原子的atomStaticKey引用资源,如这里的test-party:kitchenSink

授权途径

授权途径有三种:人工授权初始授权测试授权

- 人工授权

如果某些权限只有在实际部署或运行时才能决定,可通过管理界面进行授权操作

- 初始授权

  • 旧方案(仍有有效):如果需要在系统运行时,预先初始化权限,可以在Bean组件version.manager的方法init中通过代码分配权限

  • 新方案:由于CabloyJS4.0引入了静态原子的概念,可以直接在静态资源的定义中指定角色名,系统自动进行授权。参见:静态资源

- 测试授权

为了测试与开发的便利,还可以在开发阶段预先初始化权限,可以在Bean组件version.manager的方法test中通过代码分配权限。比如,给某些测试角色分配权限

测试授权仅在测试环境开发环境有效

src/module/test-party/backend/src/bean/version.manager.js

const VersionTestFn = require('./version/test.js');

async test() {
  const versionTest = new (VersionTestFn(this.ctx))();
  await versionTest.run();
}

授权API

- addResourceRole

src/module-system/a-base-sync/backend/src/bean/bean.resource.js

async addResourceRole({ atomId, atomStaticKey, roleId })
名称 说明
atomId 资源的原子Id
atomStaticKey 资源的atomStaticKey,据此得到资源的原子Id
roleId 角色Id

授权判断方式

可以通过中间件Api进行授权的判断

- 中间件判断

CabloyJS使用中间件right封装了授权判断的逻辑,只需在后端路由上配置相应的中间件参数即可

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

{ method: 'post', path: 'kitchen-sink/guide/echo9', controller: 'testKitchensinkGuide',
  meta: {
    right: { 
      type: 'resource', 
      // module: 'test-party',
      name: 'kitchenSink',
      // atomStaticKey: 'test-party:kitchenSink',
    },
  },
},
名称 说明
right 全局中间件right,默认处于开启状态,只需配置参数即可
type 授权类型,这里是资源授权
module + name / atomStaticKey 引用资源
  • module+name: 一般而言,name就是在静态资源中指定的atomStaticKey,如果是在模块内部引用,就可以忽略module,如果是跨模块引用,就必须指定module

- Api判断

src/module-system/a-base-sync/backend/src/bean/bean.resource.js

  • checkRightResource: 单独判断
async checkRightResource({ resourceAtomId, atomStaticKey, user }) 
名称 说明
resourceAtomId 资源的原子Id
atomStaticKey 资源的atomStaticKey,据此得到资源的原子Id
user 用户
  • check: 批量判断
async check({ atomStaticKeys, user }) 
名称 说明
atomStaticKeys 资源的atomStaticKey数组
user 用户