vue 路由及按钮权限控制 思路总结

说点儿闲话

本文是做者最近查阅权限控制相关资料的总结笔记html

路由权限控制

前端路由是所有都由后端返回,仍是后端返回对应角色下的权限,而后前端经过遍历的方式来修改当前路由呢?
引用上面这个问题的采纳答案:前端

第一种后台返回路由,第二种后台返回权限。
共同点:

两种方法均可以实现需求
前端都要维护一份路由地址与模块文件地址的映射
后段返回的数据通常都要再遍历作二次处理
有关页面内元素(按钮)的权限都要另作处理
技术点都会涉及路由守卫和路由鉴权vue

差别点:ios

默认路由列表:方法一只维护home、login等无权限需求路由,其余路由须要后续经过接口和路由api:addRoutes动态添加;方法二须要维护一个全量的路由列表,不须要额外添加路由,经过配置每一个路由的access数组来作鉴权。
路由跳转:由于方法一返回的就是该用户权限下的路由,因此不须要再作权限鉴权;方法二须要。
路由的自定义程度:方法一能够经过修改数据库的路由数据来自定义前端的菜单结构,所以也须要作一个实现路由重组的递归函数,拓展性更好;方法二针对的是菜单结构相对稳定的项目,通常不支持结构变更。
返回报文:通常来讲,返回报文大小 方法一比方法二要大git

总结补充:
第一种是指动态路由,路由是分两部分,一部分是home、login等无权限需求路由,一部分是由后端返回的该用户权限下的路由,当用户登陆后获得 roles,前端根据roles 去向后端请求可访问的路由表,从而动态生成可访问页面,以后就是 router.addRoutes 动态挂载到 router 上;前端须要有菜单管理,能够经过修改路由数据来自定义前端的菜单结构,拓展性更好。
第二种是前端配置路由表,后端仅返回权限,前端须要有菜单的权限管理,而且加载路由和菜单时要作权限验证;该方法是针对菜单结构相对稳定的项目,通常不支持结构变更。github

按钮权限控制

视图控制

依据权限实现的按钮显隐控制和界面变化:
方法一:v-if数据库

方法二:自定义指令axios

根据用户权限判断各个按钮的显示与否,方式无非是v-if或自定义指令,并且只要将v-if背后的权限校验逻辑抽象成方法,不管是代码量仍是使用形式上都跟自定义指令几乎同样

v-if的特色是它会响应数据变化,所以随着应用的运行会频繁触发权限校验,而权限在应用的整个生命周期内其实只需校验一次。segmentfault

自定义指令内部仍然是调用全局验证方法,但优势在于只会在元素初始化时执行一次,多数状况下都应该使用自定义指令实现视图控制。后端

因此,最好是使用自定义指令。

不必定每一个操做按钮都会发起AJAX请求,好比编辑按钮自己并不会触发请求,真正触发请求的是另外一个保存按钮。

划重点:
让按钮和请求联系起来,好比说按钮涉及一个名称为A的请求,那么权限指令能够这样写:

<btn v-has="A" @click="Fn">按钮</btn>
这里对A的实现能够有多种形式,好比A能够是一个包含两个属性的对象:
const A = {
  p: ['put,/menu/**'],
  r: params => {
    return axios.put(`/menu/${params.id}`, params)
  }
};
//用做权限:
<btn v-has="[A]" @click="Fn">按钮</btn>
//用做请求:
function Fn(){
    A.r().then((res) => {})
}

请求控制

利用axios拦截器实现的,目的是将越权请求在前端拦截掉。在请求拦截器中判断本次请求是否符合用户权限,以决定是否拦截。在请求发起前集中拦截,这时能够直接根据请求方法和请求地址来校验权限。

以axios为例,拦截器大概长这样:

axios.interceptors.request.use(function (config) {
 if(!has(config)){
 //验证不经过
   return Promise.reject({
     message: `no permission`
   });
 }
 return config;
});

参考资料

前端路由是所有都由后端返回,仍是后端返回对应角色下的权限,而后前端经过遍历的方式来修改当前路由呢?

权限验证 | vue-element-admin
手摸手,带你用vue撸后台 系列二(登陆权限篇)

用addRoutes实现动态路由
基于Vue实现后台系统权限控制
Vue2.0用户权限控制解决方案

相关文章
相关标签/搜索