首页 > 语言 > JavaScript > 正文

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

2024-05-06 15:35:49
字体:
来源:转载
供稿:网友

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

路由元信息(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)    }   })  } }}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选