侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Vue 权限控制的两种方法(路由验证)

前端  /  管理员 发布于 4年前   268

下面介绍两种权限控制的方法:

  • 路由元信息(meta)
  • 动态加载菜单和路由(addRoutes)

路由元信息(meta)

如果一个网站有不同的角色,比如 管理员 和 普通用户 ,要求不同的角色能访问的页面是不一样的

这个时候我们就可以 把所有的页面都放在路由表里 ,只要 在访问的时候判断一下角色权限 。如果有权限就让访问,没有权限的话就拒绝访问,跳转到404页面

vue-router 在构建路由时提供了元信息 meta 配置接口,我们可以在元信息中添加路由对应的权限,然后在路由守卫中检查相关权限,控制其路由跳转。

可以在每一个路由的 meta 属性里,将能访问该路由的角色添加到 roles 里。用户每次登陆后,将用户的角色返回。然后在访问页面时,把路由的 meta 属性和用户的角色进行对比,如果用户的角色在路由的 roles 里,那就是能访问,如果不在就拒绝访问。

代码示例1:

路由信息:

routes: [  {    path: '/login',    name: 'login',    meta: {      roles: ['admin', 'user']    },    component: () => import('../components/Login.vue')  },  {    path: 'home',    name: 'home',    meta: {      roles: ['admin']    },    component: () => import('../views/Home.vue')  },]

页面控制:

//假设有两种角色:admin 和 user //从后台获取的用户角色const role = 'user'//当进入一个页面是会触发导航守卫 router.beforeEach 事件router.beforeEach((to,from,next)=>{ if(to.meta.roles.includes(role)){ next() //放行 }esle{ next({path:"/404"}) //跳到404页面 }})

代码示例2

当然也可以用下面的一种方法:

// router.js// 路由表元信息[ {  path: '',  redirect: '/home' }, {  path: '/home',  meta: {   title: 'Home',   icon: 'home'  } }, {  path: '/userCenter',  meta: {   title: '个人中心',   requireAuth: true // 在需要登录的路由的meta中添加响应的权限标识  } }]// 在守卫中访问元信息function gaurd (to, from, next) { // to.matched.some(record => record.meta.requireAuth) // 可在此处}

可以在多个路由下面添加这个权限标识,达到控制的目的

只要一切换页面,就需要看有没有这个权限,所以可以在最大的路由下 main.js 中配置

存储信息

一般的,用户登录后会在本地存储用户的认证信息,可以用 token 、 cookie 等,这里我们用 token 。

将用户的 token 保存到 localStorage 里,而用户信息则存在内存 store 中。这样可以在 vuex 中存储一个标记用户登录状态的属性 auth ,方便权限控制。

代码示例

// store.js{ state: {  token: window.localStorage.getItem('token'),  auth: false,  userInfo: {} }, mutations: {  setToken (state, token) {   state.token = token   window.localStorage.setItem('token', token)  },  clearToken (state) {   state.token = ''   window.localStorage.setItem('token', '')  },  setUserInfo (state, userInfo) {   state.userInfo = userInfo   state.auth = true // 获取到用户信息的同时将auth标记为true,当然也可以直接判断userInfo  } }, actions: {  async getUserInfo (ctx, token) {   return fetchUserInfo(token).then(response => {    if (response.code === 200) {     ctx.commit('setUserInfo', response.data)    }    return response   })  },  async login (ctx, account) {   return login(account).then(response => {    if (response.code === 200) {     ctx.commit('setUserInfo', response.data.userInfo)     ctx.commit('setToken', response.data.token)    }   })  } }}

写好路由表和vuex之后,给所有路由设置一个全局守卫,在进入路由之前进行权限检查,并导航到对应的路由。

// store.js{ state: {  token: window.localStorage.getItem('token'),  auth: false,  userInfo: {} }, mutations: {  setToken (state, token) {   state.token = token   window.localStorage.setItem('token', token)  },  clearToken (state) {   state.token = ''   window.localStorage.setItem('token', '')  },  setUserInfo (state, userInfo) {   state.userInfo = userInfo   state.auth = true // 获取到用户信息的同时将auth标记为true,当然也可以直接判断userInfo  } }, actions: {  async getUserInfo (ctx, token) {   return fetchUserInfo(token).then(response => {    if (response.code === 200) {     ctx.commit('setUserInfo', response.data)    }    return response   })  },  async login (ctx, account) {   return login(account).then(response => {    if (response.code === 200) {     ctx.commit('setUserInfo', response.data.userInfo)     ctx.commit('setToken', response.data.token)    }   })  } }}

上述的方法是基于 jwt 认证方式,本地不持久化用户信息,只保存 token ,当用户刷新或者重新打开网页时,进入需要登录的页面都会尝试去请求用户信息,该操作在整个访问过程中只进行一次,直到刷新或者重新打开,对于应用后期的开发维护和扩展支持都很好。

动态加载菜单和路由(addRoutes)

有时候为了安全,我们需要根据用户权限或者是用户属性去动态的添加菜单和路由表,可以实现对用户的功能进行定制。 vue-router 提供了 addRoutes() 方法,可以动态注册路由, 需要注意的是,动态添加路由是在路由表中 push 路由,由于路由是按顺序匹配的,因此需要将诸如404页面这样的路由放在动态添加的最后。

代码示例

// store.js// 将需要动态注册的路由提取到vuex中const dynamicRoutes = [ {  path: '/manage',  name: 'Manage',  meta: {   requireAuth: true  },  component: () => import('./views/Manage') }, {  path: '/userCenter',  name: 'UserCenter',  meta: {   requireAuth: true  },  component: () => import('./views/UserCenter') }]

在 vuex 中添加 userRoutes 数组用于存储用户的定制菜单。在setUserInfo中根据后端返回的菜单生成用户的路由表。

// store.jssetUserInfo (state, userInfo) { state.userInfo = userInfo state.auth = true // 获取到用户信息的同时将auth标记为true,当然也可以直接判断userInfo // 生成用户路由表 state.userRoutes = dynamicRoutes.filter(route => {  return userInfo.menus.some(menu => menu.name === route.name) }) router.addRoutes(state.userRoutes) // 注册路由}

修改菜单渲染

// App.vue
主页 登录

总结

以上所述是小编给大家介绍的Vue 权限控制的两种方法(路由验证),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

您可能感兴趣的文章:

  • vue中如何实现后台管理系统的权限控制的方法示例
  • 基于Vue自定义指令实现按钮级权限控制思路详解
  • 基于vue,vue-router, vuex及addRoutes进行权限控制问题
  • vue-router路由懒加载和权限控制详解
  • Vue2.0用户权限控制解决方案
  • 详解基于vue-router的动态权限控制实现方案
  • vue-router beforeEach跳转路由验证用户登录状态
  • vue登录路由验证的实现
  • vue中路由验证和相应拦截的使用详解


  • 上一条:
    JS中的算法与数据结构之列表(List)实例详解
    下一条:
    jQuery zTree树插件的使用教程
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客