当前位置:首页 > 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(); // 放行
  }
});

动态路由表

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

// 定义基础路由(所有用户可见)
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 字段声明权限要求:

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 router权限实现

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

相关文章

vue实现选择本地文件

vue实现选择本地文件

实现文件选择功能 在Vue中实现本地文件选择可以通过HTML原生的<input type="file">元素实现。创建一个基本的文件选择组件: <template> &…

vue 实现blog

vue 实现blog

Vue 实现博客的基本步骤 使用 Vue 实现博客可以分为前端和后端两部分,前端使用 Vue.js 框架,后端可以选择 Node.js、Python 或其他服务端语言。以下是一个基于 Vue 的博客实…

vue实现盖章

vue实现盖章

Vue 实现盖章功能 在Vue中实现盖章功能通常涉及前端UI交互,通过Canvas或SVG绘制印章,并允许用户拖拽或点击放置印章。以下是具体实现方法: 使用Canvas绘制印章 通过HTML5的Ca…

vue实现排序

vue实现排序

Vue 实现排序的方法 在 Vue 中实现排序可以通过多种方式完成,以下是一些常见的方法: 使用计算属性排序数组 计算属性非常适合对数据进行排序,因为它会在依赖的数据变化时自动更新。以下是一个示例:…

vue实现fullpage

vue实现fullpage

Vue 实现 FullPage 效果 在 Vue 中实现全屏滚动(FullPage)效果可以通过多种方式完成,以下是几种常见的方法: 使用现有库 vue-fullpage.js 安装 vue-ful…

javascript实现vue

javascript实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,主要包括数据绑定、响应式系统和虚拟 DOM。以下是一个简化的实现示例。 数据响应式系统 通过 Object.de…