# 鉴权
DbMeta已经针对Rest接口资源、菜单、路由、按钮甚至页面的每一个元素做了权限控制支持。你需要做的,只是打上"标签"即可。
# Rest接口鉴权
Rest接口打标签有两种方式:
- 注解:
@Authorize这是asoco-common包里的通用注解。全类路径为:cn.com.asoco.annotation.Authorize, 这应该也是我们平常业务开发时常用的方式。 - 数据库动态配置: 在【平台维护】> 【接口资源】模块中,你可以为目标接口新增一条记录,并设置其鉴权方式。如图:

# 两种方式优缺点
| 优点 | 缺点 | |
|---|---|---|
@Authorize注解 | 我们比较熟悉, 维护成本低, 自动随代码提交到其他环境 | 不灵活, 如果需要改变一个接口的权限控制, 需要重新改写、提交并部署 |
| 【接口资源】动态配置 | 很灵活, 可以改变接口的权限控制,而不需要动代码和重新部署 | 提高了维护成本,如果开发环境配置了,上线时要记得sql导出并同步到线上环境 |
针对【接口资源】动态配置 的缺点,我计划在后续一两个版本中引入 数据导入导出功能,详见这里。
# 菜单鉴权
dbmeta支持动态菜单和编程菜单。
# 动态菜单
如果是动态菜单,创建/更新菜单时可以看到权限控制相关表单项:

鉴权配置和接口鉴权时一致的,不多赘述。
# 编程菜单
{
"path": "/route1-1",
"title": "禁用的编程菜单",
"icon": "el-icon-menu",
"hidden": false,
"disable": true,
"order": 0,
// 下面是权限相关
"need_permit": false,
"permit_by": "auth",
"auths": [],
"auth_match_mode": "any",
"roles": [],
"role_match_mode": "any"
}
上述权限相关配置项给出的都是默认值。注意的是:
当指定了auths时,就可以无需指定need_permit,会视作true。但如果指定了auths又声明了need_permit为false, 则不会鉴权, need_permit优先级最高。 因此如果你依据权限判定,判定模式为任一匹配, 则配置可以省略为如下:
{
"auths": [
"your_auth_code"
]
}
其他的几个就可以不用写了。
# 路由鉴权
dbmeta的路由也同样分为动态路由和编程路由。
# 动态路由
和动态菜单完全一致。
# 编程路由
配置项也和编程菜单一致。不同的是,这几个鉴权配置项要放在路由数据的meta属性中。如下:
const routes = [
// 编程路由
{
path: "/",
component: YourComponent,
name: 'Index',
meta: {
need_permit: false,
permit_by: "auth",
auths: [],
auth_match_mode: "any",
roles: [],
role_match_mode: "any"
}
},
]
同样的,上面给的也是默认值,当指定了auths时也可以不指定need_permit, 省略写法和编程菜单一致。
路由数据格式是 VueRouter定的, 官方建议将自定义路由数据配置项放到meta中。这也是和编程菜单唯一不同点的原因。
# 按钮、页面元素鉴权
前端页面元素的权限控制原理是通过自定义权限指令实现,无权限的用户隐藏元素。dbmeta内置了几个权限指令,如下:
# v-any-auths
用法如下:
<el-button v-any-auths="['yourAuthCode1', 'yourAuthCode2']"></el-button>
用户有yourAuthCode1, yourAuthCode2任一一个权限即可见此按钮。
# v-all-auths
<el-button v-all-auths="['yourAuthCode1', 'yourAuthCode2']"></el-button>
用户同时有yourAuthCode1, yourAuthCode2两个权限即可见此按钮。
# v-any-roles
<el-button v-any-roles="['yourRoleCode1', 'yourRoleCode2']"></el-button>
用户有yourRoleCode1, yourRoleCode2任一一个角色即可见此按钮。
# v-all-roles
<el-button v-all-auths="['yourRoleCode1', 'yourRoleCode2']"></el-button>
用户同时有yourRoleCode1, yourRoleCode2两个角色即可见此按钮。
# v-authorize
指令值接受一个权限配置项数据。注意,不是权限或角色编码数组。而是类似下面这样的对象:
const value = {
need_permit: false,
permit_by: "auth",
auths: [],
auth_match_mode: "any",
roles: [],
role_match_mode: "any"
}
用法:
<template>
<el-menu-item v-authorize="value"></el-menu-item>
</template>
<script>
export default {
data() {
return {
value: {
need_permit: false,
permit_by: "auth",
auths: [],
auth_match_mode: "any",
roles: [],
role_match_mode: "any"
}
}
}
}
</script>
WARNING
dbmeta支持鉴权时的鉴权依据(permit_by),支持按权限,或按角色。
但是强烈建议,要么系统全部依据权限鉴权,要么全部依据角色鉴权。 否则会显得很乱,不利于系统的简洁。 强烈建议就按照默认的权限鉴权,通过角色来分配权限,清爽而且很灵活。