vue中后台管理登录后的token管理

本文介绍如何在Vue后台管理系统中实现登录后的Token管理与动态路由权限控制,包括使用Vuex存储Token、通过axios根据Token获取用户信息、判断用户访问权限及刷新页面后的信息重新获取。

在做后台管理系统的时候,登录后token管理很重要。上代码,有瑕疵,有待改善,见谅。

import Vue from 'vue'
import Router from 'vue-router'
import { canTurnTo, setTitle } from '@/lib/util';//第一个是判断权限的函数
import { route } from './routes'//路由列表,路由在另一个页面写的。
import store from '../../../store/index'//获取到vuex
import { getUserInfo } from '@/request/apis/user'//获取axios写好的根据token重新获取用户信息。
Vue.use(Router)

const turnTo = (to, access, next) => {//这个是用来判断是否有权限访问当前页面,可以先跳过,在下面的路由判断里面会用到。
  if (canTurnTo(to.name, access)) {
    next() // 有权限,可访问
  } else {
    next({ replace: false, name: 'error_401' }) // 无权限,重定向到401页面
  }
}
const router = new Router({//配置路由
  mode: 'hash',
  routes: route
})


// 登录token管理与过滤,卸载vue中的全局守卫中最好不过了。
router.beforeEach((to, from, next) => {
  const token = store.state.token;//先获取到登录时在vuex里存的token
  // 开始判断,如果token存在
  if (token) {
    if (to.name === 'login') {//token已经存在还跳转的是登录页面,则跳转到首页
      next({ name: 'home' })//这里跳转到哪自己更改
    } else {//tokend存在跳转的不是登录页,则需要判断权限
      if (store.state.setHasGetInfo) {//是否获取了用户信息,这个也是在vuex里存的一个开关,登录后保存信息后保存为true.
        turnTo(to, store.state.access, next);//然后进行路由的权限判断,因为后台的权限不一样,每个人跳转的页面是可以分配的,所以后端会返回每个用户可以跳转的页面权限,登录时保存在vuex里。
      } else {//如果没有获取用户信息,则根据token重新获取用户信息保存起来,这里主要是为刷新页面准备的,因为刷新页面时vuex里的东西都会没有了.
  //但用户信息很多,不能都保存在session里来防止刷新,所以session里只保存了token,来防止刷新后token也不见了。
        getUserInfo().then(d => {//当页面刷新后然后重新请求接口,后端会根据token来重新获取到用户的信息。
          if (d.data.code === 100000) {
            turnTo(to, d.data.data.menus, next);//然后再次进行判断
            store.dispatch('setInfo', d.data.data)//重新将用户信息保存起来
          } else {
            store.dispatch('removeInfo')
            next({
              name: 'login'
            })
          }
        }).catch(err => {
          // 请求失败则删除掉所有保存的信息,并跳转回登录页面
          store.dispatch('removeInfo')
          next({
            name: 'login'
          })
        })
      }
    }
  } else {//如果没有token,就简单了,如果跳转的是登录页,则让他跳转就好了,如果跳转的是其他页面,统统跳到登录页面去。
    if (to.name === 'login') {
      next()
    } else {
      next({ name: 'login' })
    }
  }
})
//这个是配置浏览器窗口标题。
router.afterEach(to => {
  setTitle(to, router.app)
  // iView.LoadingBar.finish()
  window.scrollTo(0, 0)
})

export default router

然后下面的是上面那个判断权限的判定函数,是写在另一个页面,引入进来的。

 * @param {*} name 即将跳转的路由name
 * @param {*} access 用户权限数组,从vuex里获取到的。登录是保存的
export const canTurnTo = (name, access) => {
  if (name !== undefined) {
    var bool = access.some(item => item.url === name)//跳转的路由页面name是否在返回的用户权限里面,这里这个url是后端返回的,是前端给后端的字段,和自己的每个路由里的name值配置的一样,就可以进行判断了。
    if (bool || noaccess.indexOf(name) != -1) {//返回的权限能匹配上或者name和其他一些默认的页面(如login,home,error_401这些页面)能匹配上则返回true,否则则返回false。noaccess是上面var了一个数组,里面放了一些通用的路由的name值。
      return true
    } else {
      return false;
    }
  }else{
    return false;
  }
}

当然,其实动态路由的实现可以使用addRoutes这个api更好点。不过这里因为一些原因没使用,这个我也没用过,小伙伴可以去研究研究,有大佬会的不要吝啬哦。感谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值