当前位置:首页 > 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. 服务端返回路由
    更严格的权限控制可由服务端返回路由结构,前端直接解析后动态加载。

    addroutes和vue实现权限

完整代码示例

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

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

相关文章

vue实现权限分离

vue实现权限分离

Vue 实现权限分离的方法 在 Vue 项目中实现权限分离通常涉及前端路由控制、组件级权限和接口权限管理。以下是几种常见的实现方式: 基于路由的权限控制 通过动态路由的方式,根据用户权限加载不同的路…

vue的权限控制实现

vue的权限控制实现

Vue 权限控制实现方法 路由级权限控制 通过路由守卫(beforeEach)实现动态路由过滤,结合用户角色控制可访问路由表。典型代码如下: // router.js router.beforeEa…

前端vue实现不同权限

前端vue实现不同权限

权限控制实现方案 在Vue项目中实现权限控制通常涉及路由权限、页面元素权限和API权限三个层面。以下是常见的实现方法: 路由权限控制 基于用户角色或权限动态生成可访问路由表。在路由守卫中进行权限校验…

vue实现按钮及权限

vue实现按钮及权限

Vue 实现按钮及权限控制 在 Vue 中实现按钮及权限控制可以通过多种方式完成,以下是一些常见的方法: 自定义指令方式 创建自定义指令 v-permission,用于控制按钮的显示与隐藏: //…

vue实现后台权限管理

vue实现后台权限管理

Vue 实现后台权限管理的方法 路由权限控制 通过动态路由实现权限过滤,在用户登录后根据角色或权限列表生成可访问的路由表。使用 Vue Router 的 addRoutes 方法动态添加路由。 //…

react如何按钮权限

react如何按钮权限

按钮权限控制的实现方法 在React中实现按钮权限控制通常需要结合前端权限系统和后端验证。以下是几种常见的方法: 基于角色或权限的渲染控制 通过用户角色或权限列表控制按钮的显示与隐藏: /…