权限
FiveAdmin 提供开箱即用的权限控制,包括路由、菜单权限和按钮级的细粒度权限控制。
框架提供了两种权限控制方案:基于角色、基于权限标识。
基于角色编码
页面权限
基于角色编码的路由权限控制是使用路由信息中的 meta.roles 与 用户信息中的 roles 进行比对,不匹配的路由不会被注册。
// 用代码简单说明
const userA = {
// ...
roles:['admin']
}
const userB = {
// ...
roles:['test']
}
const routeA = {
path:'home',
// ...
meta:{
roles:['admin']
}
}
/*
userA 登录后 routeA 被注册
userB 登录后 routeA 不被注册
*/
提示
meta.roles 的属性值可以为数组或字符串。
如果不设置 meta.roles 的属性值,此路由永远都会被注册。
如果设置了 meta.roles 的属性值并且为空数组,此路由永远都不会被注册。
按钮级权限
指令方式
<el-button v-hasRole="'admin'"> admin角色可见 </el-button>
<span v-hasRole:or="['admin','test']"> admin或test角色可见 </span>
<div v-hasRole:all="['admin','test']"> admin且test角色可见 </div>
提示
v-hasRole:or --> 值可以为字符串和数组,角色值匹配其一就显示组件/标签
v-hasRole:all --> 值只可以是数组,角色值全部包含才显示组件/标签
v-hasRole --> v-hasRole:or 的简写
函数方式
<template>
<div>
<p v-if="hasRole('admin')">admin角色可见</p>
<p v-if="hasRole(['admin', 'test'])">admin或test角色可见</p>
<p v-if="hasRoleAll(['admin', 'test'])">admin且test角色可见</p>
</div>
</template>
<script setup>
import useAuth from '@/hooks/useAuth'
const { hasRole,hasRoleAll } = useAuth()
</script>
提示
hasRole(val: String | Array) --> 当前用户角色与 val 值匹配其一即为 true。
hasRoleAll(arr: Array) --> 当前用户角色必须包含 arr 中的所有值才为 true
基于权限标识符
页面权限
FiveAdmin 没有基于权限标识符对路由及菜单进行过滤,推荐接入后端时在对应的获取路由的接口中处理,将处理后的路由结果响应给 FiveAdmin。
按钮级权限
指令方式
<el-button v-hasPerm="'sys:menu:add'"> 拥有 sys:menu:add 权限标识码的用户可见 </el-button>
<span v-hasPerm:or="['add','del']"> 拥有 add 或 del 权限标识码的用户可见 </span>
<div v-hasPerm:all="['add','del']"> 拥有 add 且 del 权限标识码的用户可见 </div>
提示
v-hasPerm:or --> 值可以为字符串和数组,权限标识码匹配其一就显示组件/标签
v-hasPerm:all --> 值只可以是数组,权限标识码全部包含才显示组件/标签
v-hasPerm --> v-hasPerm:or 的简写
函数方式
<template>
<div>
<el-button v-if="hasPerm('addButton')"> 拥有 addButton 权限标识码的用户可见 </el-button>
<p v-if="hasPerm(['menu:del', 'menu:add'])"> 拥有 menu:del 或 menu:add 权限标识码的用户可见 </p>
<p v-if="hasPermAll(['menu', 'menu:add'])"> 拥有 menu 且有 menu:add 权限标识码的用户可见 </p>
</div>
</template>
<script setup>
import useAuth from '@/hooks/useAuth'
const { hasPerm,hasPermAll } = useAuth()
</script>
提示
hasPerm(val: String | Array) --> 当前用户权限标识码与 val 值匹配其一即为 true
hasPermAll(arr: Array) --> 当前用户权限标识码必须包含 arr 中的所有值才为 true
提示
函数方式对比指令方式,无论是基于角色还是基于权限标识,函数方式是响应式的。这好像并没有什么用。
通配符
暂时没有,已考虑新增此功能。
支持字符串通配符匹配校验
? 字符匹配任何单个字符。
* 字符匹配任何字符序列。
<p v-hasPerm="'*'"> 所有权限可见 </p>
......
后端接入推荐
推荐使用基于权限标识符的方式接入后端,因为基于角色的方式接入后端作者没有测试,在作者的前后端新项目中也暂时没有用到。有兴趣尝试基于角色方式接入后端的伙伴们,在遇到问题时欢迎反馈。