vue项目权限管理(vue项目权限控制)

首先,权限管理⼀般需求是两个:⻚⾯权限和按钮权限。

  1. 权限管理⼀般需求是⻚⾯权限和按钮权限的管理
  2. 具体实现的时候分后端和前端两种⽅案:

前端⽅案会把所有路由信息在前端配置,通过路由守卫要求⽤户登录,⽤户登录后根据⻆⾊过滤出路由表。⽐如我会配置⼀个 asyncRoutes 数组,需要认证的⻚⾯在其路由的 meta 中添加⼀个 roles 字段,等获取⽤户⻆⾊之后取两者的交集,若结果不为空则说明可以访问。此过滤过程结束,剩下的路由就是该⽤户能访问的⻚⾯,最后通过 router.addRoutes(accessRoutes) ⽅式动态添加路由即可。

后端⽅案会把所有⻚⾯路由信息存在数据库中,⽤户登录的时候根据其⻆⾊查询得到其能访问的所有⻚⾯路由信息返回给前端,前端再通过 addRoutes 动态添加路由信息。

按钮权限的控制通常会实现⼀个指令,例如 v-permission ,将按钮要求⻆⾊通过值传给v-permission指令,在指令的 moutned 钩⼦中可以判断当前⽤户⻆⾊和按钮是否存在交集,有则保留按钮,⽆则移除按钮。

  1. 纯前端⽅案的优点是实现简单,不需要额外权限管理⻚⾯,但是维护起来问题⽐较⼤,有新的⻚⾯和⻆⾊需求 就要修改前端代码重新打包部署;服务端⽅案就不存在这个问题,通过专⻔的⻆⾊和权限管理⻚⾯,配置⻚⾯ 和按钮权限信息到数据库,应⽤每次登陆时获取的都是最新的路由信息,可谓⼀劳永逸!

路由守卫 permission.js

import router from './router'import store from './store'import { Message } from 'element-ui'import NProgress from 'nprogress' // progress barimport 'nprogress/nprogress.css' // progress bar styleimport { getToken } from '@/utils/auth' // get token from cookieimport getPageTitle from '@/utils/get-page-title'NProgress.configure({ showSpinner: false }) // NProgress Configurationconst whiteList = ['/login', '/auth-redirect'] // no redirect whitelistrouter.beforeEach(async(to, from, next) => { // start progress bar NProgress.start() // set page title document.title = getPageTitle(to.meta.title) // determine whether the user has logged in const hasToken = getToken() if (hasToken) { if (to.path === '/login') { // if is logged in, redirect to the home page next({ path: '/' }) NProgress.done() // hack: https://github.com/PanJiaChen/vue-element-admin/pull/2939 } else { // determine whether the user has obtained his permission roles through getInfo const hasRoles = store.getters.roles && store.getters.roles.length > 0 if (hasRoles) { next() } else { try { // get user info // note: roles must be a object array! such as: ['admin'] or ,['developer','editor'] const { roles } = await store.dispatch('user/getInfo') // generate accessible routes map based on roles const accessRoutes = await store.dispatch('permission/generateRoutes', roles) // dynamically add accessible routes router.addRoutes(accessRoutes) // hack method to ensure that addRoutes is complete // set the replace: true, so the navigation will not leave a history record next({ ...to, replace: true }) } catch (error) { // remove token and go to login page to re-login await store.dispatch('user/resetToken') Message.error(error || 'Has Error') next(`/login?redirect=${to.path}`) NProgress.done() } } } } else { /* has no token*/ if (whiteList.indexOf(to.path) !== -1) { // in the free login whitelist, go directly next() } else { // other pages that do not have permission to access are redirected to the login page. next(`/login?redirect=${to.path}`) NProgress.done() } }})router.afterEach(() => { // finish progress bar NProgress.done()})复制代码

路由⽣成## permission.js

import { asyncRoutes, constantRoutes } from '@/router'/** * Use meta.role to determine if the current user has permission * @param roles * @param route */function hasPermission(roles, route) { if (route.meta && route.meta.roles) { return roles.some(role => route.meta.roles.includes(role)) } else { return true }}/** * Filter asynchronous routing tables by recursion * @param routes asyncRoutes * @param roles */export function filterAsyncRoutes(routes, roles) { const res = [] routes.forEach(route => { const tmp = { ...route } if (hasPermission(roles, tmp)) { if (tmp.children) { tmp.children = filterAsyncRoutes(tmp.children, roles) } res.push(tmp) } }) return res}const state = { routes: [], addRoutes: []}const mutations = { SET_ROUTES: (state, routes) => { state.addRoutes = routes state.routes = constantRoutes.concat(routes) }}const actions = { generateRoutes({ commit }, roles) { return new Promise(resolve => { let accessedRoutes if (roles.includes('admin')) { accessedRoutes = asyncRoutes || [] } else { accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) } commit('SET_ROUTES', accessedRoutes) resolve(accessedRoutes) }) }}export default { namespaced: true, state, mutations, actions}复制代码

动态追加路由## permission.js

import router from './router'import store from './store'import { Message } from 'element-ui'import NProgress from 'nprogress' // progress barimport 'nprogress/nprogress.css' // progress bar styleimport { getToken } from '@/utils/auth' // get token from cookieimport getPageTitle from '@/utils/get-page-title'NProgress.configure({ showSpinner: false }) // NProgress Configurationconst whiteList = ['/login', '/auth-redirect'] // no redirect whitelistrouter.beforeEach(async(to, from, next) => { // start progress bar NProgress.start() // set page title document.title = getPageTitle(to.meta.title) // determine whether the user has logged in const hasToken = getToken() if (hasToken) { if (to.path === '/login') { // if is logged in, redirect to the home page next({ path: '/' }) NProgress.done() // hack: https://github.com/PanJiaChen/vue-element-admin/pull/2939 } else { // determine whether the user has obtained his permission roles through getInfo const hasRoles = store.getters.roles && store.getters.roles.length > 0 if (hasRoles) { next() } else { try { // get user info // note: roles must be a object array! such as: ['admin'] or ,['developer','editor'] const { roles } = await store.dispatch('user/getInfo') // generate accessible routes map based on roles const accessRoutes = await store.dispatch('permission/generateRoutes', roles) // dynamically add accessible routes router.addRoutes(accessRoutes) // hack method to ensure that addRoutes is complete // set the replace: true, so the navigation will not leave a history record next({ ...to, replace: true }) } catch (error) { // remove token and go to login page to re-login await store.dispatch('user/resetToken') Message.error(error || 'Has Error') next(`/login?redirect=${to.path}`) NProgress.done() } } } } else { /* has no token*/ if (whiteList.indexOf(to.path) !== -1) { // in the free login whitelist, go directly next() } else { // other pages that do not have permission to access are redirected to the login page. next(`/login?redirect=${to.path}`) NProgress.done() } }})router.afterEach(() => { // finish progress bar NProgress.done()})复制代码

服务端返回的路由信息如何添加到路由器中?

// 前端组件名和组件映射表const map = { // xx: require('@/views/xx.vue').default // 同步的⽅式 xx: () => import('@/views/xx.vue') // 异步的⽅式 } // 服务端返回的 asyncRoutes const asyncRoutes = [ { path: '/xx', component: 'xx', ... } ] // 遍历asyncRoutes,将component替换为map[component]function mapComponent(asyncRoutes) { asyncRoutes.forEach(route => { route.component = map[route.component]; if(route.children) { route.children.map(child => mapComponent(child)) } }) } mapComponent(asyncRoutes)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年12月3日 上午9:56
下一篇 2022年12月3日 上午9:58

相关推荐

  • 妇产超声科研项目有哪些

    妇产超声科研项目有哪些 随着医学技术的不断发展,妇产超声技术也在不断进步。妇产超声技术是一种用于观察妇女子宫,胎儿和生殖道的技术。随着妇产超声技术的不断发展,许多科研项目也在进行中…

    科研百科 2025年4月28日
    0
  • 抓好高校党建带团建 培养堪当重任时代新人(高校党建带团建具体做法)

    “党建带团建”是新时期进一步加强和改进党对青年工作领导的时代要求。新时代高校党建带团建工作必须旗帜鲜明、立场坚定,坚持立德树人根本任务,通过高校党委统一部署、重点突破、全面带动,把…

    科研百科 2023年9月27日
    189
  • 生物科研项目组面试

    生物科研项目组面试: 探索未来科学的窗口 生物科研项目组面试是生物科学领域中一个重要的环节,也是许多学生和研究人员进入生物科学研究领域的重要一步。在面试中,您将有机会展示您的研究兴…

    科研百科 2025年3月24日
    0
  • 数字建筑科研项目

    数字建筑科研项目:探索未来城市数字化建设之路 随着科技的不断发展,数字建筑科研项目已经成为了建筑行业的重要组成部分。这些项目利用数字化技术来改进建筑的设计、建造和维护,提高建筑的质…

    科研百科 2025年2月28日
    0
  • 管理系统项目源码c语言

    管理系统项目源码C语言 管理系统项目是一个企业或组织中非常重要的组成部分,它负责管理企业的资源和信息。一个好的管理系统可以提高企业的效率和生产力,同时降低成本和风险。C语言是一种广…

    科研百科 1天前
    0
  • 宿舍管理系统项目估算

    宿舍管理系统项目估算 宿舍管理系统是一种用于管理宿舍住宿信息的系统,能够帮助宿舍管理员更好地管理宿舍住宿信息,提高宿舍管理的效率和准确性。本文将讨论宿舍管理系统项目的估算,包括系统…

    科研百科 2024年12月17日
    1
  • 经贸汉语能为教育互联互通做些什么(经贸汉语能为教育互联互通做些什么呢)

    汉语国际教育肩负着培养国际汉语语言人才的任务。据教育部统计,2018年,来自196个国家和地区的492185名留学生在全国31个省(区、市)的1004所高等院校就读。在这些留学生中…

    科研百科 2024年4月18日
    86
  • 前端crm客户管理系统项目经验

    前端CRM客户管理系统项目经验 随着数字化时代的到来,企业越来越倾向于使用数字化的方式来管理客户和业务。传统的手动管理客户和业务方式已经无法满足现代企业的实际需求。因此,前端CRM…

    科研百科 2025年1月16日
    0
  • 科研项目主研人

    科研项目主研人:挑战极限,追求卓越 科研项目主研人,是对一个科研项目中最为核心和重要的人。他们负责整个项目的实施和管理,并且在科学研究和技术创新方面发挥重要作用。在这篇文章中,我们…

    科研百科 2025年3月14日
    0
  • 想退出科研项目

    想退出科研项目 最近我一直在思考是否要退出我的科研项目。这种感觉越来越强烈,因为我越来越感到不适合这个项目。 我开始觉得自己的热情被耗尽了。我已经不再像以前一样感兴趣,而是感到越来…

    科研百科 2025年2月27日
    1