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 相关文章推荐
一个符号插入器 中用到的js代码
Sep 04 Javascript
javascript innerHTML、outerHTML、innerText、outerText的区别
Nov 24 Javascript
简单易用的倒计时js代码
Aug 04 Javascript
jQuery提示效果代码分享
Nov 20 Javascript
JavaScript获取URL汇总
Jun 08 Javascript
bootstrapValidator.min.js表单验证插件
Feb 09 Javascript
JavaScript验证知识整理
Mar 24 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
Dec 08 Javascript
代码详解Vuejs响应式原理
Dec 20 Javascript
JavaScript中import用法总结
Jan 20 Javascript
vue+iview分页组件的封装
Nov 17 Vue.js
javascript实现计算器功能详解流程
Nov 01 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下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
php获取当前时间的毫秒数的方法
2014/01/26 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
2017/08/04 PHP
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
2016/01/28 Javascript
js select实现省市区联动选择
2020/04/17 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
localStorage实现便签小程序
2016/11/28 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
python 正则式使用心得
2009/05/07 Python
python中的reduce内建函数使用方法指南
2014/08/31 Python
Python3 中文文件读写方法
2018/01/23 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
全球工业:Global Industrial
2020/02/01 全球购物
校长岗位职责
2013/11/26 职场文书
高中毕业自我鉴定
2013/12/13 职场文书
宿舍违规用电检讨书
2014/02/16 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
小学体育课教学反思
2016/02/16 职场文书