权限管理
1.接口权限
接口权限一般采用jwt形式来验证,没有通过的话返回401,跳转到登陆页面,登陆完拿到token,将token怒起来,通过
axios请求拦截器进行拦截,每次请求完拿到token
2.路由权限控制
在路由上标记相应的权限信息,每次路由跳转前做校验
例如:
const routerMap = [ { path: '/permission', component: Layout, redirect: '/permission/index', alwaysShow: true, // will always show the root menu meta: { title: 'permission', icon: 'lock', roles: ['admin', 'editor'] // you can set roles in root nav }, children: [{ path: 'page', component: () => import('@/views/permission/page'), name: 'pagePermission', meta: { title: 'pagePermission', roles: ['admin'] // or you can only set roles in sub nav } }, { path: 'directive', component: () => import('@/views/permission/directive'), name: 'directivePermission', meta: { title: 'directivePermission' // if do not set roles, means: this page does not require permission } }] }]
3.菜单权限
菜单与路由分离,菜单由后端返回
name菜单不为空,需要根据此字段与后端返回菜单做关联,后端返回的菜单信息中必须要有name对用的字段,并做唯一性校验
如果通过路由name找不到对应的菜单,表示用户没有访问权限
4.按钮权限
通过自定义指令进行按钮权限的判断
首先配置路由
{ path: '/permission', component: Layout, name: '权限测试', meta: { btnPermissions: ['admin', 'supper', 'normal'] }, //页面需要的权限 children: [{ path: 'supper', component: _import('system/supper'), name: '权限测试页', meta: { btnPermissions: ['admin', 'supper'] } //页面需要的权限 }, { path: 'normal', component: _import('system/normal'), name: '权限测试页', meta: { btnPermissions: ['admin'] } //页面需要的权限 }] }
自定义权限鉴定指令
import Vue from 'vue' /**权限指令**/ const has = Vue.directive('has', { bind: function (el, binding, vnode) { // 获取页面按钮权限 let btnPermissionsArr = []; if(binding.value){ // 如果指令传值,获取指令参数,根据指令参数和当前登录人按钮权限做比较。 btnPermissionsArr = Array.of(binding.value); }else{ // 否则获取路由中的参数,根据路由的btnPermissionsArr和当前登录人按钮权限做比较。 btnPermissionsArr = vnode.context.$route.meta.btnPermissions; } if (!Vue.prototype.$_has(btnPermissionsArr)) { el.parentNode.removeChild(el); } } }); // 权限检查方法 Vue.prototype.$_has = function (value) { let isExist = false; // 获取用户按钮权限 let btnPermissionsStr = sessionStorage.getItem("btnPermissions"); if (btnPermissionsStr == undefined || btnPermissionsStr == null) { return false; } if (value.indexOf(btnPermissionsStr) > -1) { isExist = true; } return isExist; }; export {has}
在使用的按钮中只需要引用v-has指令
<el-button @click='editClick' type="primary" v-has>编辑</el-button>