Vue 实现前端权限控制的示例代码


Posted in Javascript onJuly 09, 2019

登录&&权限流程图

Vue 实现前端权限控制的示例代码

前言

首先我们确定的权限控制分为三大部分,其中根据粒度大小分的更细:

  • 登录权限控制
  • 页面权限控制
    • 菜单中的页面是否可以被访问
    • 页面中的按钮 (增、删、改、查)的权限控制是否显示
  • 接口权限控制

一、登录权限控制

登录访问权限控制是对用户的校验。在用户登录成功之后,后台将返回一个token,之后前端每次进行接口请求的时候,都要带上这个token。后台拿到这个token后进行判断,如果此token确实存在并且没有过期,则可以通过访问。如果token不存在或后台判断已过期,则会跳转到登录页面,要求用户重新登录获取token。

做法一

在用户登录成功的回调中将后台返回的token直接存储到localStorage,然后同步配置请求默认参数的形式将token取出放入headers中传给后台。代码如下:

let axiosOptions = {
   method,
   url,
   data,
   timeout,
   // 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'。default json
   responseType,
   // 请求头内追加authToken属性
   headers: {
    authtToken: window.localStorage.getItem(`base/token$$`)
   }
  }

做法二

当前项目中使用axios.interceptors.request.use设置发送请求前的拦截,直接将token塞入req.headers.authToken中,作为全局传入。代码如下:

// axios.interceptors.request.use 请求拦截:配置发送请求的信息
// axios.interceptors.response.use 响应拦截:配置请求回来的信息

axios.interceptors.request.use(req => {
 req.headers.authToken = window.localStorage.getItem(`base/token$$`)
 return req
}, error => {
 return Promise.reject(error)
})

登录涉及到的知识点

  • vuex + localStorage: 本地通过vuex+localStorage持久化存储token(token:服务端创建用于唯一标识用户身份的Key)。
  • axios: 请求拦截验证token,可以使用axios的API:axios.interceptors.request.use,也可以通过添加默认参数的形式在请求头中追加token。

二、页面权限控制

上面已经说到,页面权限控制又分为两种:

  • 菜单中的页面是否可以被访问
  • 页面中的按钮 (增、删、改、查)的权限控制是否显示

先看菜单的页面访问权限

实现页面访问权限又可分为以下两种方案:

  • 方案一、初始化即挂载全部路由,每次路由跳转前做校验
  • 方案二、只挂载当前用户拥有的路由,如果用户通过URL进行强制访问,则会直接进入404,相当于从源头上做了控制

前者的缺点很明显,每次路由跳转都要做一遍检验是对计算资源的浪费,另外对于用户无权访问的路由,理论上就不应该挂载。

后者解决了上述问题,但按需挂载路由就需要知道用户的路由权限,也就是在用户登录进来的时候就要知道当前用户拥有哪些路由权限。

所以肯定是方案二比较符合良好的用户体验。

项目中的菜单权限控制

1.权限涉及到的meta属性

  • noRequireAuth: true 无需权限直接挂载
  • manageFree: true 不在操作权限树中展示

2.router.beforeEach()拦截路由的钩子

  • 不需要权限的路由直接放行。meta内noRequireAuth和manageFree不受权限控制
  • 进入路由前,从后端请求获取需要展示的菜单。后端根据token判断当前用户权限,返回对应菜单。前端递归对比确定最终要显示的菜单列表

3.router.addRoutes()

  • 通过router.addRoutes()动态添加所有符合权限的路由

按钮级权限控制(Vue指令v-permission)

1.每个模块对应有四种权限,查询(get),添加(post),更新(put),删除(delete)
2.利用十进制和二进制来表示当前模块所拥有的权限。1111(15),转换后的二进制与权限的关系表示:从右至左数(1代表拥有该权限,0代表不拥有),第一位代表查询,第二位代表添加,第三位代表更新,第四位代表删除。如eg:二进制1111(15),代表用于查询,添加,更新,删除四种权限。

3.判断对应模块没有此权限时,移除当前按钮dom元素。

使用示例:

<el-button @click="handleClick" v-permission:moduleName.post>新增</el-button>
 <el-button @click="handleClick" v-permission.delete="moduleName">删除</el-button>

三、接口访问权限控制

最后再加上请求控制作为最后一道防线,路由可能配置失误,按钮可能忘了加权限,这种时候请求控制可以用来兜底,越权请求将在前端被拦截。

前后端约定接口采用RESTful风格,同样对应四种权限,包括查询(get),添加(post),更新(put),删除(delete)。对于查询操作,正常如果参数只有一个,应该用get请求,如果有多个参数,需要改为post请求,但是需要在url后面添加/query以告诉服务端当前进行的是查询操作,用于和正常的添加(post)请求区分。同样的是,删除用户时如果有多个参数,DELETE请求同样改为POST请求,在后面添加/delete用于和正常的删除(delete)操作进行区分。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript类继承机制的原理分析
Sep 12 Javascript
脚本合并提升javascript性能示例
Feb 24 Javascript
js 获取元素下面所有li的两种方法
Apr 14 Javascript
浅谈javascript中this在事件中的应用
Feb 15 Javascript
jQuery实现的背景动态变化导航菜单效果
Aug 24 Javascript
jquery easyui如何实现格式化列
Jul 30 jQuery
react.js使用webpack搭配环境的入门教程
Aug 14 Javascript
浅谈Vue SSR 的 Cookies 问题
Nov 20 Javascript
iview中Select 选择器多选校验方法
Mar 15 Javascript
Vue和React组件之间的传值方式详解
Jan 31 Javascript
layui添加动态菜单与选项卡
Jul 26 Javascript
JavaScript 反射和属性赋值实例解析
Oct 28 Javascript
微信小程序文章详情页跳转案例详解
Jul 09 #Javascript
七行JSON代码把你的网站变成移动应用过程详解
Jul 09 #Javascript
js实现无缝滚动双图切换效果
Jul 09 #Javascript
DatePickerDialog 自定义样式及使用全解
Jul 09 #Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
Jul 09 #Javascript
bootstrap datepicker的基本使用教程
Jul 09 #Javascript
JavaScript常用内置对象用法分析
Jul 09 #Javascript
You might like
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
PHP中函数内引用全局变量的方法
2008/10/20 PHP
php使用异或实现的加密解密实例
2013/09/04 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
js 小贴士一星期合集
2010/04/07 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
jquery解析JSON数据示例代码
2014/03/17 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
2017/07/26 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
Angular6 Filter实现页面搜索的示例代码
2018/12/02 Javascript
vue h5移动端禁止缩放代码
2019/10/28 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
python查看模块安装位置的方法
2018/10/16 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
使用python3构建文件传输的方法
2019/02/13 Python
python实现美团订单推送到测试环境,提供便利操作示例
2019/08/09 Python
Python表达式的优先级详解
2020/02/18 Python
python获取整个网页源码的方法
2020/08/03 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
Java软件工程师综合面试题笔试题
2013/09/08 面试题
公司活动策划方案
2014/01/13 职场文书
大学生学期自我鉴定
2014/03/19 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
加薪申请报告范本
2015/05/15 职场文书
工作表现证明
2015/06/15 职场文书
2016年教育局“我们的节日——端午节”主题活动总结
2016/04/01 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python