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 相关文章推荐
CheckBox 如何实现全选?
Jun 23 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
May 28 Javascript
Jquery插件之打造自定义的select标签
Nov 30 Javascript
让js弹出窗口居前显示的实现方法
Jul 10 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
Dec 04 Javascript
jQuery实现冻结表头的方法
Mar 09 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
Jun 04 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
Sep 28 Javascript
小程序实现多选框功能
Oct 30 Javascript
深入浅析JavaScript中的in关键字和for-in循环
Apr 20 Javascript
React实现评论的添加和删除
Oct 20 Javascript
浅谈JS的二进制家族
May 09 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里面的抽象类
2010/01/28 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
用户注册常用javascript代码
2009/08/29 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
JavaScript闭包 懂不懂由你反正我是懂了
2011/10/21 Javascript
Jquery 例外被抛出且未被接住原因介绍
2013/09/04 Javascript
JQuery伸缩导航练习示例
2013/11/13 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
js简单网速测试方法完整实例
2015/12/15 Javascript
使用nvm管理不同版本的node与npm的方法
2017/10/31 Javascript
javascript+jQuery实现360开机时间显示效果
2017/11/03 jQuery
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
[03:07]2015国际邀请赛选手档案EHOME.rOtK 是什么让他落泪?
2015/07/31 DOTA
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
python调用fortran模块
2016/04/08 Python
Python使用django搭建web开发环境
2017/06/09 Python
vscode 远程调试python的方法
2017/12/01 Python
Python实现的圆形绘制(画圆)示例
2018/01/31 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
详解Python3中ceil()函数用法
2019/02/19 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
铭立家具面试题
2012/12/06 面试题
J2EE相关知识面试题
2013/08/26 面试题
武夷山导游词
2015/02/03 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
2015年推普周活动方案
2015/05/06 职场文书
pytorch 实现变分自动编码器的操作
2021/05/24 Python
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server
GO语言异常处理分析 err接口及defer延迟
2022/04/14 Golang
使用Django框架创建项目
2022/06/10 Python