前后端分离API路由权限

CabloyJS是前后端分离的框架。前后端分离对后端API路由权限控制提出了更高的要求。因此,权限的核心就是对后端API路由权限控制

功能API路由的关系

API路由的目的是向前端提供相应的API服务,在这里我们称之为功能。于是,一个或多个API路由对应一个功能

在实际操作中,是针对功能授权,然后在API路由中指定此路由对应哪个功能,从而实现对API路由的访问控制

如,功能角色管理,包含以下一组API路由

a-baseadmin/backend/src/routes.js

{ method: 'post', path: 'role/add', controller: role, meta: { right: { type: 'function', name: 'role' } } },
{ method: 'post', path: 'role/move', controller: role, meta: { right: { type: 'function', name: 'role' } } },
{ method: 'post', path: 'role/delete', controller: role, middlewares: 'transaction', meta: { right: { type: 'function', name: 'role' } } },
{ method: 'post', path: 'role/includes', controller: role, meta: { right: { type: 'function', name: 'role' } } },
{ method: 'post', path: 'role/addRoleInc', controller: role, meta: { right: { type: 'function', name: 'role' } } },
{ method: 'post', path: 'role/removeRoleInc', controller: role, meta: { right: { type: 'function', name: 'role' } } },
{ method: 'post', path: 'role/build', controller: role, middlewares: 'transaction', meta: { right: { type: 'function', name: 'role' } } },
{ method: 'post', path: 'role/dirty', controller: role, meta: { right: { type: 'function', name: 'role' } } },

功能菜单的关系

菜单属于功能的特例:

  1. 首先,菜单也对应一个或多个API路由,其授权方式与功能一致

  2. 其次,将功能的属性menu设为1,就成为了菜单,同时再给菜单指定一个前端页面组件的路径,就可以在首页显示一个菜单链接

声明菜单

每个模块后端有一个meta元数据对象,可以在里面声明一个菜单

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

const meta = {
  base: {
    functions: {
      kitchenSink: {
        title: 'Kitchen-sink',
        scene: 'tools',
        actionPath: 'kitchen-sink/index',
        sorting: 1,
        menu: 1,
      },
    },
  },
};
名称 说明
title 菜单标题,如果要支持国际化,可以直接添加对应的语言资源
scene 菜单场景,用于菜单的分类显示
actionPath 前端页面组件路径
sorting 用于显示的排序值
menu 是否为菜单,如果不是菜单就是功能

特别菜单

有两个特别的菜单类型:新建原子原子列表,其权限是与原子权限相关联的。比如,当我们配置了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 对应的原子指令

绑定API路由

在后端API路由中配置中间件right有两方面作用:

  1. 指定后端API路由功能的关系
  2. 验证当前用户是否有访问后端API路由的权限

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

{ method: 'post', path: 'kitchen-sink/guide/echo9', controller: testKitchensinkGuide,
  meta: {
    right: {
      type: 'function',
      name: 'kitchenSink',
    },
  },
},
名称 说明
meta 是路由的元数据,可以指定与中间件相关的参数
right 中间件right的参数
type 授权类型,这里是功能授权
name 需要进行授权验证的功能名称

中间件right是全局中间件,专门用于授权验证