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读取中文COOKIE的解决办法
Feb 15 Javascript
jquery HotKeys轻松搞定键盘事件代码
Aug 30 Javascript
jQuery中width()方法用法实例
Dec 24 Javascript
JQuery工具函数汇总
Jun 15 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
May 17 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
May 27 Javascript
JavaScript中数组Array.sort()排序方法详解
Mar 01 Javascript
vue.js中指令Directives详解
Mar 20 Javascript
js canvas实现QQ拨打电话特效
May 10 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
Oct 09 Javascript
详解auto-vue-file:一个自动创建vue组件的包
Apr 26 Javascript
vue学习笔记之Vue中css动画原理简单示例
Feb 29 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 smarty 二级分类代码和模版循环例子
2011/06/01 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
获取PHP警告错误信息的解决方法
2013/06/03 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
2014/09/24 PHP
详解PHP实现执行定时任务
2015/12/21 PHP
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
python查找目录下指定扩展名的文件实例
2015/04/01 Python
Python实现telnet服务器的方法
2015/07/10 Python
python 图像平移和旋转的实例
2019/01/10 Python
TensorFlow2.0:张量的合并与分割实例
2020/01/19 Python
python scatter函数用法实例详解
2020/02/11 Python
python logging设置level失败的解决方法
2020/02/19 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
金融专业应届生求职信
2013/11/02 职场文书
员工评语大全
2014/01/19 职场文书
趣味体育活动方案
2014/02/08 职场文书
西式婚礼主持词
2014/03/13 职场文书
灰雀教学反思
2014/04/28 职场文书
狼牙山五壮士观后感
2015/06/09 职场文书
画展观后感
2015/06/17 职场文书
公司管理制度范本
2015/08/03 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android