当前位置:首页 > VUE

vue router权限实现

2026-01-19 00:27:19VUE

Vue Router 权限实现方案

Vue Router 的权限控制通常基于用户角色或权限标识,限制用户访问特定路由。以下是几种常见实现方式:

路由守卫(全局前置守卫)

利用 router.beforeEach 全局守卫进行权限校验,在路由跳转前拦截并验证权限:

router.beforeEach((to, from, next) => {
  const userRole = localStorage.getItem('userRole'); // 获取用户角色
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth);
  const requiredRole = to.meta.role;

  if (requiresAuth && !userRole) {
    next('/login'); // 未登录跳转登录页
  } else if (requiredRole && requiredRole !== userRole) {
    next('/403'); // 无权限跳转403页面
  } else {
    next(); // 放行
  }
});

动态路由表

根据用户权限动态生成路由表,仅加载有权限的路由:

vue router权限实现

// 定义基础路由(所有用户可见)
const constantRoutes = [
  { path: '/login', component: Login },
  { path: '/404', component: NotFound }
];

// 定义动态路由(按权限加载)
const asyncRoutes = [
  { path: '/admin', component: Admin, meta: { role: 'admin' } },
  { path: '/user', component: User, meta: { role: ['admin', 'user'] } }
];

// 根据权限过滤路由
function filterRoutes(routes, roles) {
  return routes.filter(route => {
    if (route.meta && route.meta.role) {
      return roles.some(role => route.meta.role.includes(role));
    }
    return true;
  });
}

// 初始化路由
const router = new VueRouter({ routes: constantRoutes });

// 登录后动态添加路由
const allowedRoutes = filterRoutes(asyncRoutes, ['user']);
router.addRoutes(allowedRoutes);

组件级权限控制

在组件内部进行细粒度权限校验,结合自定义指令或函数:

// 自定义权限指令
Vue.directive('permission', {
  inserted(el, binding) {
    const userRole = localStorage.getItem('userRole');
    if (binding.value && !binding.value.includes(userRole)) {
      el.parentNode.removeChild(el); // 无权限则移除元素
    }
  }
});

// 使用方式
<button v-permission="['admin']">管理员按钮</button>

权限元信息配置

通过路由的 meta 字段声明权限要求:

vue router权限实现

const routes = [
  {
    path: '/dashboard',
    component: Dashboard,
    meta: { 
      requiresAuth: true,
      roles: ['admin', 'editor'] 
    }
  }
];

服务端权限校验

对于高安全性场景,应在服务端进行二次校验:

// 前端请求时携带权限信息
axios.interceptors.request.use(config => {
  config.headers['X-User-Role'] = localStorage.getItem('userRole');
  return config;
});

// 后端返回路由配置
axios.get('/api/routes').then(response => {
  router.addRoutes(response.data.routes);
});

错误处理

实现统一的权限错误处理机制:

router.onError(error => {
  if (error.name === 'NavigationDuplicated') {
    return;
  }
  if (error.message.includes('Failed to resolve async component')) {
    router.push('/403');
  }
});

最佳实践建议

  • 权限数据应持久化存储(如 Vuex + localStorage)
  • 敏感路由建议服务端渲染时也进行校验
  • 动态路由需考虑刷新页面时的重新初始化问题
  • 404页面应作为保底路由最后添加

以上方案可根据实际项目需求组合使用,实现从全局到组件级别的完整权限控制体系。

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

相关文章

在线脑图 vue 实现

在线脑图 vue 实现

在线脑图 Vue 实现方案 使用开源库实现 推荐使用 mind-elixir 或 jsmind 这类开源库,它们专为脑图设计且支持 Vue 集成。 安装依赖: npm install mind-e…

vue 实现过滤

vue 实现过滤

Vue 实现过滤的方法 在 Vue 中实现过滤功能可以通过多种方式完成,包括使用计算属性、自定义过滤器、第三方库等。以下是几种常见的实现方法: 使用计算属性进行过滤 计算属性是 Vue 中最常用的过…

vue实现route

vue实现route

Vue 路由实现方法 Vue 中实现路由通常使用 vue-router 库,这是 Vue 官方推荐的路由管理器。以下是具体实现步骤: 安装 vue-router 通过 npm 或 yarn 安装…

proxy实现vue

proxy实现vue

使用 Proxy 实现 Vue 响应式系统 Vue 3 的响应式系统基于 JavaScript 的 Proxy API,通过代理对象实现对属性的拦截和依赖追踪。以下是实现的核心逻辑: 创建响应式对象…

用vue实现echarts

用vue实现echarts

使用 Vue 实现 ECharts 安装依赖 在 Vue 项目中安装 ECharts 和 Vue-ECharts(官方推荐的 Vue 封装库): npm install echarts vue-ec…

vue实现销售程序

vue实现销售程序

Vue实现销售程序的基本步骤 搭建Vue项目基础结构 使用Vue CLI或Vite初始化项目,安装必要依赖(如Vue Router、Vuex/Pinia、Element UI/Ant Design V…