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 相关文章推荐
js 表单验证方法(实用)
Apr 28 Javascript
jquery插件制作简单示例说明
Feb 03 Javascript
jQuery Mobile页面跳转后未加载外部JS原因分析及解决
Mar 18 Javascript
表格单元格交错着色实现思路及代码
Apr 01 Javascript
javascript上传图片前预览图片兼容大多数浏览器
Oct 25 Javascript
js对象继承之原型链继承实例
Jan 10 Javascript
js实现宇宙星空背景效果的方法
Mar 03 Javascript
浅谈javascript构造函数与实例化对象
Jun 22 Javascript
javascript中的previousSibling和nextSibling的正确用法
Sep 16 Javascript
vue.js 初体验之Chrome 插件开发实录
May 13 Javascript
微信小程序实现MUI数字输入框效果
Jan 31 Javascript
vue权限问题的完美解决方案
May 08 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
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
PHP mkdir()无写权限的问题解决方法
2014/06/19 PHP
php限制文件下载速度的代码
2015/10/20 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
使用jquery实现放大镜效果
2014/09/02 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
vue实现菜单切换功能
2019/05/08 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
Python中map和列表推导效率比较实例分析
2015/06/17 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
Python paramiko模块使用解析(实现ssh)
2019/08/30 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
python爬虫请求头设置代码
2020/07/28 Python
Python从文件中读取数据的方法步骤
2020/11/18 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
Fanatics官网:运动服装、球衣、运动装备
2020/10/12 全球购物
大学生求职推荐信
2013/11/27 职场文书
初一家长会邀请函
2014/01/31 职场文书
汽车转让协议书
2015/01/29 职场文书
中学生逃课检讨书
2015/02/17 职场文书
最感人的道歉情书
2015/05/12 职场文书
通讯稿范文
2015/07/22 职场文书
部门主管竞聘书
2015/09/15 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
redis数据结构之压缩列表
2022/03/21 Redis