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 相关文章推荐
对YUI扩展的Gird组件 Part-1
Mar 10 Javascript
javascript中的float运算精度实例分析
Aug 21 Javascript
js图片处理示例代码
May 12 Javascript
javascript函数中参数传递问题示例探讨
Jul 31 Javascript
AngularJs Understanding the Model Component
Sep 02 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
Sep 23 Javascript
js实现截图保存图片功能的代码示例
Feb 16 Javascript
JS解析url查询参数的简单代码
Aug 06 Javascript
vue实现商城上货组件简易版
Nov 27 Javascript
使用Vue写一个datepicker的示例
Jan 27 Javascript
微信小程序实现团购或秒杀批量倒计时
Nov 01 Javascript
ES6 Promise对象的应用实例分析
Jun 27 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
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
2014/07/02 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
在JavaScript中操作时间之setYear()方法的使用
2015/06/12 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
基于vue-cli3创建libs库的实现方法
2019/12/04 Javascript
weui上传多图片,压缩,base64编码的示例代码
2020/06/22 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
2020/09/02 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
Python使用multiprocessing创建进程的方法
2015/06/04 Python
不可错过的十本Python好书
2017/07/06 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
英国高街品牌:Miss Selfridge(塞尔弗里奇小姐)
2016/09/21 全球购物
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
必须要使用游标的SQL语句有那些
2012/05/07 面试题
科研课题实施方案
2014/03/18 职场文书
企业文化演讲稿
2014/05/20 职场文书
巴西世界杯32强口号
2014/06/05 职场文书
小学运动会口号
2014/06/07 职场文书
应届毕业生自荐书
2014/06/18 职场文书
机关领导查摆四风思想汇报
2014/09/13 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
机关保密工作承诺书
2015/05/04 职场文书
python基础之匿名函数详解
2021/04/21 Python
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL