基于vue实现网站前台的权限管理(前后端分离实践)


Posted in Javascript onJanuary 13, 2018

Javascript做为当下的热门语言,用途很广泛,从前端到后端处处可见其存在,该技术如今在我们项目内部也大量使用来开发诸如CMS系统以及其他其他一些数据分析系统的前端页面,为此个人非常感兴趣并将其作为帽子卡的扩展内容来进行课余学习。
Javascript框架鳞次栉比,但基本原理大致相同,因此选用国内人开发的vue.js进行一个初步的尝试。学习vue.js也一周多的时间了,说起vue的主要用法,无外乎Declarative Rendering、Component System、Client-side Routing、Vue-resource、Axios以及视项目大小而决定是否使用的Vuex,学习vue事小,主要转变思维,面向前后端分离的组件式web开发才是真正想去实践的。

正好我的个人网站CodeSheep最近要开发后台管理,因此正好用vue这一套来实现了一下。说到后台管理,绕不开的问题就是权限的管理。既然想实践前后端分离这种思想,因此后台管理的所有web前端的东西应该独立由前端完成,这其中就包括很重要的由前端来根据权限进行相关东西的控制。我们想要做到的是:不同的权限对应着不同的路由,同时页面侧边栏也应该根据不同的权限,来异步生成对应的菜单,讲白了就是后台管理时不同权限的用户其看到的界面菜单是不一样的,因此有了这里实现登录和权限验证的一套流程。
具体实现

1、点击“登录”按钮触发登录事件

this.$store.dispatch('LoginByEmail', this.loginForm).then(() => {
 this.$router.push({ path: '/' }); //登录成功之后重定向到首页
}).catch(err => {
 this.$message.error(err); //登录失败提示错误
});

其中异步触发的actions LoginByEmail的处理内容如下:

LoginByEmail ({ commit }, userInfo) {
   const email = userInfo.email.trim()
   return new Promise((resolve, reject) => {
    loginByEmail(email, userInfo.password).then(response => {
     const data = response.data
     setToken(response.data.token)
     commit('SET_TOKEN', data.token)
     resolve()
    }).catch(error => {
     reject(error)
    })
   })
  }

很容易看出想做的是将从服务器端拿到的token(唯一标示用户身份)放到浏览器本地Cookie中去

2、全局钩子router.beforeEach中拦截路由

这一步是核心,具体处理流程示意如下:

基于vue实现网站前台的权限管理(前后端分离实践)

路由拦截处理流程

具体代码如下:

router.beforeEach((to, from, next) => {
 if (getToken()) { // 判断是否取到token
  if (to.path === '/login') {
   next({ path: '/' })
  } else {
   if (store.getters.roles.length === 0) { // 判断当前用户是否已获取完user_info信息
    store.dispatch('GetInfo').then(res => { // 获取user_info
     const roles = res.data.role
     store.dispatch('GenerateRoutes', { roles }).then(() => { // 生成可访问的路由表
      router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
      next({ ...to }) // 放行路由
     })
    }).catch(() => {
     store.dispatch('FedLogOut').then(() => {
      next({ path: '/login' })
     })
    })
   } else {
    next() // 放行该路由
   }
  }
 } else {
  if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单里的路径,继续让其访问
   next()
  } else { // 其他不在白名单里的路径全部让其重定向到登录页面!
   next('/login')
   alert('not in white list, now go to the login page')
  }
 }
})

流程图中几个重要步骤解释一下:

判断前端是否取到了token令牌:getToken()

操作很简单,主要是从Cookie中获取,看token是不是已经拿到了:

export function getToken () {
 return Cookies.get(TokenKey)
}

vuex异步操作store.dispatch('GetInfo'):获取用户信息

GetInfo ({ commit, state }) {
   return new Promise((resolve, reject) => {
    getInfo(state.token).then(response => {
     const data = response.data
     console.log(data)
     commit('SET_ROLES', data.role)
     commit('SET_NAME', data.name)
     resolve(response)
    }).catch(error => {
     reject(error)
    })
   })
  }

操作也很简单,用一个get的restful api从服务器获取用户的角色和名字

vuex异步操作store.dispatch('GenerateRoutes', { roles }):根据不同的roles来生成不同的前台路由

GenerateRoutes ({ commit }, data) {
   return new Promise(resolve => {
    const { roles } = data
    let accessedRouters
    if (roles.indexOf('admin') >= 0) {
     accessedRouters = asyncRouter
    } else {
     accessedRouters = filterAsyncRouter(asyncRouter, roles)
    }
    commit('SET_ROUTERS', accessedRouters)
    resolve()
   })
  }

从代码中可以看出,我这是只区分了管理员角色admin和其他普通用户(即非Aadmin两种权限)

该系列的实践后续还将尝试更多,将会一一撰帖成文,我也是个初学者,路漫漫而求索之。。。

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

Javascript 相关文章推荐
javascript 日期时间函数(经典+完善+实用)
May 27 Javascript
Lua表达式和控制结构学习笔记
Dec 15 Javascript
JS从数组中随机取出几个数组元素的方法
Aug 02 Javascript
AngularJS实现单独作用域内的数据操作
Sep 05 Javascript
jQuery实现的背景颜色渐变动画效果示例
Mar 24 jQuery
Cookies 和 Session的详解及区别
Apr 21 Javascript
AngularJS 霸道的过滤器小结
Apr 26 Javascript
javascript 中模板方法单例的实现方法
Oct 17 Javascript
js 取消页面可以选中文字的功能方法
Jan 02 Javascript
jQuery 点击获取验证码按钮及倒计时功能
Sep 20 jQuery
通过循环优化 JavaScript 程序
Jun 24 Javascript
vue中watch的用法汇总
Dec 28 Vue.js
详解webpack-dev-server使用http-proxy解决跨域问题
Jan 13 #Javascript
vuejs实现递归树型菜单组件
Jan 13 #Javascript
在vue中通过axios异步使用echarts的方法
Jan 13 #Javascript
详解基于vue-cli配置移动端自适应
Jan 13 #Javascript
javascript用rem来做响应式开发
Jan 13 #Javascript
深入理解ES6之数据解构的用法
Jan 13 #Javascript
详解ES6语法之可迭代协议和迭代器协议
Jan 13 #Javascript
You might like
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
2016/03/05 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
分分钟学会vue中vuex的应用(入门教程)
2017/09/14 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
关于React动态加载路由处理的相关问题
2019/01/07 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
[54:24]Optic vs TNC 2018国际邀请赛小组赛BO2 第二场
2018/08/18 DOTA
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
python爬虫之自动登录与验证码识别
2020/06/15 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
门诊手术室工作制度
2014/01/30 职场文书
学习标兵获奖感言
2014/02/20 职场文书
病危通知书样本
2015/04/17 职场文书