vue登录以及权限验证相关的实现


Posted in Javascript onOctober 25, 2019
关键词:前后端分离、jwt、登录、权限验证

最近在做一个小应用,需要用到vue实现登录,以及给不同路由设置权限。在网上看了很多文章,讲的是乱七八糟。感叹国内技术类文章实在是差劲,抄来抄去。这篇文章就说说我最后是如何实现的。

前后端分离项目中,后端提供api接口给前端,使用jwt发放权限。

首先前端提供用户名和密码请求登录接口,后端验证之后返回给前端一个token,之后前端在请求需要权限的接口时携带这个token就可以了。

两个问题

现在面临两个问题,

首先vue中不同的路由有不同的权限,比如我要访问后台 /admin, 就需要先登录才行,而有的页面不需要登录。

第二个问题是,vue组件中使用axios请求后台服务时,不同的接口有不同的权限。

vue登录以及权限验证相关的实现

后端接口权限

先来解决第二个问题。vue不同组件都要用到axios,我们在全局为axios添加request和response的拦截器。

也就是,在发起请求之前,先检测header是否携带token信息。在接收响应之前,先查看后端返回状态码,如果说需要token验证就跳转到登录界面。

在main.js添加如下,或者新增一个http.js文件:

// * http request 拦截器
axios.interceptors.request.use(
  config => {
    // * 判断是否存在token,如果存在的话,则每个http header都加上token
    // * token会在登录之后存储在本地
    if (localStorage.token) {
      config.headers["Authorization"] = `Bearer ${localStorage.token}`;
    }
    return config;
  },
  err => {
    return Promise.reject(err);
  });

// * http response 拦截器
axios.interceptors.response.use(
  response => {
    let data = response.data;
    // * 正常返回数据
    if (data.code === 0) {
      // * 返回data
      return data
    }
    // * 如果code是20103 表示token未认证(后端定义的错误码)
    // * 跳转到login
    if (data.code === 20103) {
      router.replace('/login')
    }
    return Promise.reject(data);
  },
  error => {
    return Promise.reject(error);
  });

Vue.prototype.$http = axios;

现在发起的任何请求之前都会检查是否携带token,如果没有就跳到login界面。

在login中,携带用户名和密码获取token之后,存放到本地。

login.vue:

axios.post('/api/login', {
          email: this.email,
          password: this.password
        }) .then((res) => {
            // * 存储token
            localStorage.setItem('token', res.data.token);
            console.info("login successful");
            // * 跳转回登录前页面
            this.$router.push({path: this.$route.query.redirect || '/admin',})

          }).catch((error) => {
          console.error(error)
        });

前端vue路由权限

现在,访问后端接口的权限问题解决了。但是在vue中我不同的页面有不同的访问权限该如何处理?vue-router官方文档给出了例子:

在需要权限的路由添加meta信息,表明该路由需要登录才能访问,然后在所有路由跳转之前添加处理函数,如果没有auth,跳转到登录:

path: '/admin',
name: 'admin',
component: () => import('../views/admin/Admin.vue'),
// * 需要登录才能访问
meta: {requiresAuth: true},
// * 全局钩子
router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {
    // * 对于需要auth的路径
    // * 没有token信息,redirect to login
    if (!localStorage.token) {
      next({
        path: '/login',
        query: {redirect: to.fullPath}
      })
    } else {
      next()
    }
  } else {
    next() // 确保一定要调用 next()
  }
})

登出的话,清除token信息即可。

localStorage.removeItem("token")

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

Javascript 相关文章推荐
JavaScript 继承详解(三)
Jul 13 Javascript
什么是DOM(Document Object Model)文档对象模型
Mar 05 Javascript
jQuery动画animate方法使用介绍
May 06 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
Aug 21 Javascript
jquery实现叠层3D文字特效代码分享
Aug 21 Javascript
基于javascript实现九九乘法表
Mar 27 Javascript
js实现获取两个日期之间所有日期的方法
Jun 17 Javascript
node.js学习之事件模块Events的使用示例
Sep 28 Javascript
在vue中使用Autoprefixed的方法
Jul 27 Javascript
react中实现搜索结果中关键词高亮显示
Jul 31 Javascript
vue实现的下拉框功能示例
Jan 29 Javascript
node.js文件操作系统实例详解
Nov 05 Javascript
vue-next/runtime-core 源码阅读指南详解
Oct 25 #Javascript
JS实现简单tab选项卡切换
Oct 25 #Javascript
vue项目从node8.x升级到12.x后的问题解决
Oct 25 #Javascript
JS实现骰子3D旋转效果
Oct 24 #Javascript
Vue可自定义tab组件用法实例
Oct 24 #Javascript
js实现转动骰子模型
Oct 24 #Javascript
js实现固定区域内的不重叠随机圆
Oct 24 #Javascript
You might like
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
ThinkPHP之R方法实例详解
2014/06/20 PHP
php实现两表合并成新表并且有序排列的方法
2014/12/05 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
php+Ajax无刷新验证用户名操作实例详解
2019/03/04 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
2011/10/24 Javascript
解决json日期格式问题的3种方法
2014/02/02 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
2020/12/25 Vue.js
Python的面向对象思想分析
2015/01/14 Python
python动态参数用法实例分析
2015/05/25 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
2017/05/25 Python
python使用fork实现守护进程的方法
2017/11/16 Python
使用Python如何测试InnoDB与MyISAM的读写性能
2018/09/18 Python
详解python的argpare和click模块小结
2019/03/31 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
Everlast官网:拳击、综合格斗和健身相关的体育用品
2020/08/03 全球购物
家佳咖啡店创业计划书
2013/12/27 职场文书
英语专业学生的自我评价
2013/12/30 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
学校周年庆活动方案
2014/08/22 职场文书
大学生年度个人总结
2015/02/15 职场文书
干部考核工作总结2015
2015/07/24 职场文书
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android