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 相关文章推荐
jquery 与NVelocity 产生冲突的解决方法
Jun 13 Javascript
jquery 隐藏与显示tr标签示例代码
Jun 06 Javascript
JavaScript中的null和undefined区别介绍
Jan 01 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
Sep 16 Javascript
js中获取 table节点各tr及td的内容简单实例
Oct 14 Javascript
原生js实现新闻列表展开/收起全文功能
Jan 20 Javascript
基于Three.js实现360度全景图片
Dec 30 Javascript
Vue项目中使用WebUploader实现文件上传的方法
Jul 21 Javascript
微信小程序 WXML节点信息查询详解
Jul 29 Javascript
实现一个Vue自定义指令懒加载的方法示例
Jun 04 Javascript
详解vue实现坐标拾取器功能示例
Nov 18 Vue.js
微信小程序实现购物车小功能
Dec 30 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调用Webservice思路及源码分享
2014/06/04 PHP
golang与php实现计算两个经纬度之间距离的方法
2016/07/22 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
jquery获取节点名称
2015/04/26 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
原生JS实现图片翻书效果
2017/02/16 Javascript
原生JS+Canvas实现五子棋游戏实例
2017/06/19 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
2019/09/26 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
Numpy数据类型转换astype,dtype的方法
2018/06/09 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
Python中PyQt5/PySide2的按钮控件使用实例
2019/08/17 Python
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
解释一下抽象方法和抽象类
2016/08/27 面试题
女大学生自我鉴定
2013/12/09 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
学习张丽丽心得体会
2014/09/03 职场文书
工作批评与自我批评范文
2014/10/16 职场文书
消费者投诉书范文
2015/07/02 职场文书
KTV员工管理制度
2015/08/06 职场文书
PyTorch的Debug指南
2021/05/07 Python
浅谈Python数学建模之线性规划
2021/06/23 Python