# 鉴权

DbMeta已经针对Rest接口资源、菜单、路由、按钮甚至页面的每一个元素做了权限控制支持。你需要做的,只是打上"标签"即可。

# Rest接口鉴权

Rest接口打标签有两种方式:

  1. 注解: @Authorize 这是asoco-common包里的通用注解。全类路径为:cn.com.asoco.annotation.Authorize, 这应该也是我们平常业务开发时常用的方式。
  2. 数据库动态配置: 在【平台维护】> 【接口资源】模块中,你可以为目标接口新增一条记录,并设置其鉴权方式。如图: img.png

# 两种方式优缺点

优点 缺点
@Authorize注解 我们比较熟悉, 维护成本低, 自动随代码提交到其他环境 不灵活, 如果需要改变一个接口的权限控制, 需要重新改写、提交并部署
【接口资源】动态配置 很灵活, 可以改变接口的权限控制,而不需要动代码和重新部署 提高了维护成本,如果开发环境配置了,上线时要记得sql导出并同步到线上环境

针对【接口资源】动态配置 的缺点,我计划在后续一两个版本中引入 数据导入导出功能,详见这里

# 菜单鉴权

dbmeta支持动态菜单和编程菜单。

# 动态菜单

如果是动态菜单,创建/更新菜单时可以看到权限控制相关表单项: img.png

鉴权配置和接口鉴权时一致的,不多赘述。

# 编程菜单

{
  "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),支持按权限,或按角色。

但是强烈建议,要么系统全部依据权限鉴权,要么全部依据角色鉴权。 否则会显得很乱,不利于系统的简洁。 强烈建议就按照默认的权限鉴权,通过角色来分配权限,清爽而且很灵活。

Last Updated: 5/17/2022, 1:33:44 PM