当前位置:首页 > VUE

addroutes和vue实现权限

2026-02-21 08:47:53VUE

使用 addRoutes 和 Vue 实现权限控制

在 Vue 项目中,动态路由(addRoutes)是实现权限控制的常见方式。通过根据用户权限动态加载路由,可以确保用户只能访问其权限范围内的页面。

核心思路

  1. 路由分为静态路由和动态路由

    • 静态路由:所有用户均可访问的路由(如登录页、404页)。
    • 动态路由:根据用户权限动态加载的路由(如后台管理页面)。
  2. 权限验证流程

    • 用户登录后,后端返回用户权限标识(如角色或权限列表)。
    • 前端根据权限标识筛选可访问的路由,并通过 addRoutes 动态添加到路由实例。

实现步骤

1. 定义静态路由和动态路由

router/index.js 中拆分路由:

// 静态路由(所有用户均可访问)
export const constantRoutes = [
  { path: '/login', component: () => import('@/views/Login.vue') },
  { path: '/404', component: () => import('@/views/404.vue') }
];

// 动态路由(需权限控制)
export const asyncRoutes = [
  { 
    path: '/admin', 
    component: () => import('@/views/Admin.vue'),
    meta: { roles: ['admin'] } // 需要 admin 角色
  },
  { 
    path: '/user', 
    component: () => import('@/views/User.vue'),
    meta: { roles: ['user', 'admin'] } // 需要 user 或 admin 角色
  }
];

2. 创建路由实例并初始化

import Vue from 'vue';
import Router from 'vue-router';
import { constantRoutes } from './router';

Vue.use(Router);

const createRouter = () => new Router({
  routes: constantRoutes // 初始仅加载静态路由
});

const router = createRouter();

export default router;

3. 权限验证与动态加载路由

在用户登录后,根据权限动态加载路由:

import { asyncRoutes } from '@/router';

// 模拟后端返回的用户权限
const userRole = 'admin'; // 实际从接口获取

// 过滤动态路由
function filterRoutes(routes, roles) {
  return routes.filter(route => {
    if (route.meta?.roles) {
      return route.meta.roles.includes(roles);
    }
    return true;
  });
}

// 动态添加路由
const accessedRoutes = filterRoutes(asyncRoutes, userRole);
router.addRoutes(accessedRoutes);

// 添加 404 路由捕获未匹配路径
router.addRoutes([{ path: '*', redirect: '/404' }]);

4. 路由守卫控制访问权限

在全局路由守卫中校验权限:

router.beforeEach((to, from, next) => {
  const hasToken = localStorage.getItem('token');

  // 未登录且访问非登录页,跳转到登录页
  if (!hasToken && to.path !== '/login') {
    next('/login');
  } 
  // 已登录且访问登录页,跳转到首页
  else if (hasToken && to.path === '/login') {
    next('/');
  } 
  // 校验动态路由权限
  else if (to.meta?.roles) {
    const userRole = localStorage.getItem('role');
    if (to.meta.roles.includes(userRole)) {
      next();
    } else {
      next('/403'); // 无权限页面
    }
  } 
  // 其他情况放行
  else {
    next();
  }
});

注意事项

  1. 路由重置问题
    addRoutes 方法不会覆盖原有路由,重复调用可能导致路由重复。解决方案是在动态加载前重置路由:

    // 重置路由
    function resetRouter() {
      const newRouter = createRouter();
      router.matcher = newRouter.matcher; // 替换路由匹配器
    }
  2. 菜单生成
    动态路由通常需要配合动态菜单生成。可以通过遍历过滤后的路由生成菜单数据。

  3. 404 路由处理
    动态路由加载后,需确保 404 路由位于最后,否则会优先匹配。

  4. 服务端返回路由
    更严格的权限控制可由服务端返回路由结构,前端直接解析后动态加载。

完整代码示例

Vue 动态权限路由示例仓库 提供了更完整的实现参考。

addroutes和vue实现权限

标签: 权限addroutes
分享给朋友:

相关文章

vue指令实现权限

vue指令实现权限

Vue 指令实现权限控制 在 Vue 中,可以通过自定义指令来实现前端权限控制。以下是一种常见的实现方式: 自定义权限指令 // 在 main.js 或单独的文件中定义指令 Vue.directi…

vue实现菜单权限

vue实现菜单权限

基于路由的动态菜单权限控制 在Vue中实现菜单权限通常需要结合路由配置和用户角色/权限数据。以下是常见的实现方法: 路由配置中添加权限标识 // router.js const routes…

vue 实现菜单权限

vue 实现菜单权限

Vue 实现菜单权限的方法 基于路由守卫的权限控制 在 Vue 项目中,可以通过路由守卫(Navigation Guards)来实现菜单权限控制。这种方式适用于基于角色的权限管理,确保用户只能访问其权…

vue实现页面权限

vue实现页面权限

Vue 实现页面权限的方法 路由守卫控制权限 在 Vue 项目中,可以通过路由守卫(beforeEach)实现页面权限控制。在路由跳转前,检查用户是否有权限访问目标页面。 // router/in…

vue按钮权限实现

vue按钮权限实现

实现按钮权限的常见方法 在Vue项目中实现按钮权限控制,通常有以下几种方案: 基于v-directive的自定义指令 创建自定义指令v-permission,在指令中判断用户权限并控制DOM显示隐…

vue route实现权限控制

vue route实现权限控制

Vue Router 权限控制实现方法 路由元信息(meta)结合导航守卫 在路由配置中通过 meta 字段标记权限要求,例如需要登录或特定角色: const routes = [ {…