功能与菜单

2018-11-29 02:56:46

前后端分离API路由权限

Cabloy是前后端分离的框架。前后端分离对后端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-todo/backend/src/meta.js

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

特殊菜单

有两个特殊的菜单类型:新建原子原子列表,其权限是与原子权限相关联的。比如,当我们配置了todocreateread权限,也就相应的具有了新建todo查看todo列表这两个菜单项的权限

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

const meta = {
  base: {
    functions: {
      createTodo: {
        title: 'Create Todo',
        scene: 'create',
        autoRight: 1,
        atomClassName: 'todo',
        action: 'create',
        sorting: 1,
        menu: 1,
      },
      listTodo: {
        title: 'Todo List',
        scene: 'list',
        autoRight: 1,
        atomClassName: 'todo',
        action: 'read',
        sorting: 1,
        menu: 1,
      },
    },
  },
};
名称 说明
autoRight 设为1,表示是自动权限,与对应的原子权限保持一致
atomClassName 对应的原子类型名称
action 对应的原子指令

绑定API路由

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

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

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

// test
{ method: 'post', path: 'test/echo', controller: test, middlewares: 'transaction,middlewareDemo',
  meta: {
    right: {
      type: 'function',
      name: 'testEcho',
    },
  },
},
名称 说明
meta 是路由的元数据,可以指定与中间件相关的参数
right 中间件right的参数
type 授权类型,这里是功能授权
name 需要进行授权验证的功能名称


评论: