您的位置:

Vue 路由权限详解

一、路由权限介绍

路由权限是指在前端页面路由跳转时,根据用户身份或权限等级来决定允许或拒绝用户访问某一页面或某一个路由的设置。这种做法主要是为了保护某些敏感信息或操作,确保系统的安全性。在大型系统中,路由权限成为不可或缺的一部分。

二、基本的路由权限实现

实现路由权限的基本思路是在需要权限控制的路由设置meta信息,通过路由守卫根据用户角色或者权限等级来判断是否有权访问该页面或者路由。以下是一个简单的示例:

const router = new VueRouter({
  mode: 'history',
  routes: [
    {
      path: '/',
      name: 'home',
      meta: {
        requiresAuth: true // 需要验证登录状态
      }
    },
    {
      path: '/about',
      name: 'about',
      meta: {
        requiresAuth: true, // 需要验证登录状态
        roles: ['admin'] // 需要管理员权限
      }
    },
    {
      path: '/login',
      name: 'login'
    }
  ]
})

router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!store.getters.isAuthenticated) {
      next({
        path: '/login',
        query: { redirect: to.fullPath }
      })
    } else if (to.matched.some(record => record.meta.roles)) {
      if (!store.getters.isAdmin) {
        next({ name: 'home' })
      } else {
        next()
      }
    } else {
      next()
    }
  } else {
    next()
  }
})

以上代码中,我们在路由配置中添加了meta信息,如`requiresAuth`、`roles`等。在全局导航守卫中,我们判断是否需要验证登录状态和角色权限,如果没有登录或者没有相应角色权限,就被跳转到登录页面或者首页,否则就继续访问。

三、动态路由权限实现

在实际的业务场景中,经常会出现路由需要动态生成的情况。因此,在路由实现动态生成时,我们可以在前端将路由信息传递给后端,由后端根据用户身份或者权限等级来动态生成相应的路由,从而保证不同用户可以访问他们有权限访问的路由。

以下是一个动态路由权限实现的示例:

const dynamicRoutes = [
  {
    path: '',
    component: Layout,
    children: [
      {
        path: 'dashboard',
        component: Dashboard,
        name: 'dashboard',
        meta: { requiresAuth: true, roles: ['admin', 'editor'] }
      }
    ]
  }
]

router.beforeEach((to, from, next) => {
  if (store.getters.roles.length === 0) {
    // 判断当前用户是否已经拉取完user_info信息
    store.dispatch('GetUserInfo').then(res => { // 拉取user_info
      const roles = res.roles
      store.dispatch('GenerateRoutes', { roles }).then(() => { // 根据roles权限生成可访问的路由表
        router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
        next({ ...to, replace: true }) // hack方法,确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
      })
    }).catch(() => {
      store.dispatch('FedLogOut').then(() => {
        Message.error('验证失败,请重新登录')
        next({ path: '/login' })
      })
    })
  } else {
    // 没有动态改变权限的需求可直接next() 删除下方权限判断 ↓
    if (hasPermission(store.getters.roles, to.meta.roles)) {
      next()//
    } else {
      next({ path: '/401', replace: true, query: { noGoBack: true }})
    }
  }
})

在以上代码中,我们首先定义了一个动态路由表`dynamicRoutes`,在用户登录后,根据用户的角色权限动态生成相应的路由表,然后使用`router.addRoutes`动态添加路由。在用户每次页面跳转之前会执行全局前置守卫,如果用户没有拉取过用户信息,则调用API从后台获取用户信息,使用根据用户权限动态生成的路由表动态添加路由,然后执行跳转。如果路由需要管理员或其他权限,则根据用户role在hasPermission中判断是否有权限,没有则跳转到401页面。

四、路由和组件的权限控制

在某些业务场景下,需要对组件内部的某些操作或某些内容进行权限限制,例如系统管理员和普通用户拥有的操作权限不同,普通用户无法进行删除等操作。这时,我们可以在组件内部设置相应的权限控制。

以下是一个组件内部的权限控制示例:

<template>
  <div>
    <h1 v-if="hasPermission" ref="header">我是管理员</h1>
    <h1 v-else>我是普通用户</h1>
    <button v-if="hasPermission" @click="delete">删除</button>
  </div>
</template>

<script>
export default {
  data () {
    return {
      hasPermission: false
    }
  },
  created () {
    // 获取用户权限信息,并根据权限决定是否显示或可操作
    const roles = this.$store.getters.roles
    if (roles.includes('admin')) {
      this.hasPermission = true
    }
  },
  methods: {
    delete () {
      // 点击删除按钮的操作
    }
  }
}
</script>

在以上代码中,我们在组件中定义了一个`hasPermission`的属性,通过获取用户角色信息来判断当前用户是否是管理员,从而决定是否显示或者可操作某些内容。例如`h1`标签和`button`标签分别根据是否是管理员来决定是否显示。同时,在`delete`方法中,我们也可以根据用户的角色来限制用户的操作,例如只有管理员可以进行删除操作。

五、总结

以上就是关于Vue路由权限的详细介绍。我们从基本路由权限实现、动态路由权限实现、路由和组件的权限控制等多个方面对路由权限做了详细的阐述。通过对路由权限的认识和实现,可以使前端页面跳转更加安全,同时可以有效地保护系统的安全性。