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 Date对象时间格式化功能的小例子
Dec 02 Javascript
javaScript 页面自动加载事件详解
Feb 10 Javascript
jquery序列化表单以及回调函数的使用示例
Jul 02 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
Mar 04 Javascript
jquery实现手机号码选号的方法
Jul 31 Javascript
jQuery1.9+中删除了live以后的替代方法
Jun 17 Javascript
jquery点赞功能实现代码 点个赞吧!
May 29 jQuery
Angular2使用Angular-CLI快速搭建工程(二)
May 21 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
May 28 Javascript
layui弹出框Tab选项卡的示例代码
Sep 04 Javascript
微信小程序以ssm做后台开发的实现示例
Apr 08 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
Aug 10 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 变量未定义等错误的解决方法
2011/01/12 PHP
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
作为PHP程序员你要知道的另外一种日志
2018/07/30 PHP
使用jquery实现以post打开新窗口
2014/03/19 Javascript
JS判断浏览器是否支持某一个CSS3属性的方法
2014/10/17 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
2015/10/10 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
2015/12/03 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
BootStrap前端框架使用方法详解
2020/02/26 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
python实现爬虫下载美女图片
2015/07/14 Python
使用python加密自己的密码
2015/08/04 Python
Python 实现购物商城,含有用户入口和商家入口的示例
2017/09/15 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
Python使用matplotlib绘制随机漫步图
2018/08/27 Python
多个python文件调用logging模块报错误
2020/02/12 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
女性时尚网购:Chic Me
2019/07/30 全球购物
奢华的意大利皮革手袋:Bene Handbags
2019/10/29 全球购物
师范毕业生个人求职信
2013/12/09 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
销售人员工作自我评价
2014/09/21 职场文书
教师辞职信范文
2015/02/28 职场文书
2015年感恩节活动总结
2015/03/24 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
大学生党员暑假实践(活动总结)
2019/08/21 职场文书
创业计划书之酒店
2019/08/30 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
Python采集爬取京东商品信息和评论并存入MySQL
2022/04/12 Python