当前位置:首页 > VUE

使用vue实现权限控制

2026-02-24 21:49:12VUE

基于路由的权限控制

通过路由守卫(beforeEach)结合用户角色动态过滤路由表,仅允许访问有权限的路由。

实现步骤

  1. 定义路由元信息
    在路由配置中添加 meta 字段标记所需权限角色:

    const routes = [
      { path: '/admin', component: AdminPage, meta: { roles: ['admin'] } },
      { path: '/user', component: UserPage, meta: { roles: ['user', 'admin'] } }
    ];
  2. 全局前置守卫校验权限
    router.beforeEach 中检查用户角色是否匹配路由要求:

    router.beforeEach((to, from, next) => {
      const userRoles = store.getters.roles; // 从Vuex或Pinia获取用户角色
      if (to.meta?.roles) {
        if (userRoles.some(role => to.meta.roles.includes(role))) {
          next();
        } else {
          next('/forbidden'); // 跳转到无权限页面
        }
      } else {
        next();
      }
    });

动态菜单渲染

根据用户权限过滤导航菜单,仅显示有权限访问的菜单项。

实现步骤

  1. 过滤菜单数据
    使用计算属性基于用户角色过滤菜单:

    computed: {
      filteredMenus() {
        return allMenus.filter(menu => {
          return !menu.meta?.roles || this.userRoles.some(role => menu.meta.roles.includes(role));
        });
      }
    }
  2. 渲染菜单组件
    在模板中遍历过滤后的菜单数据:

    <template v-for="menu in filteredMenus">
      <router-link :to="menu.path">{{ menu.title }}</router-link>
    </template>

组件级权限控制

使用自定义指令或高阶组件控制按钮/组件的显示。

自定义指令实现

  1. 注册指令

    Vue.directive('permission', {
      inserted(el, binding, vnode) {
        const { value } = binding;
        const userRoles = vnode.context.$store.getters.roles;
        if (value && !userRoles.some(role => value.includes(role))) {
          el.parentNode?.removeChild(el); // 无权限时移除元素
        }
      }
    });
  2. 模板中使用

    <button v-permission="['admin']">删除</button>

API请求拦截

在Axios拦截器中校验接口权限,防止非法请求。

实现示例

使用vue实现权限控制

axios.interceptors.request.use(config => {
  const requiredRole = config.meta?.role; // 从接口配置获取所需角色
  if (requiredRole && !userRoles.includes(requiredRole)) {
    return Promise.reject(new Error('无权限访问'));
  }
  return config;
});

补充说明

  • 角色管理:建议将角色数据存储在Vuex或Pinia中集中管理。
  • 动态路由:可通过 router.addRoutes()(Vue 2)或 router.addRoute()(Vue 3)动态注册路由。
  • 按钮级控制:若需更细粒度控制,可结合 v-if 与权限校验函数。

以上方法可根据实际项目需求组合使用,实现从路由到组件层的完整权限控制。

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

相关文章

vue树形实现

vue树形实现

Vue 树形组件实现方法 使用递归组件实现树形结构 递归组件是 Vue 中实现树形结构的常见方法。通过组件调用自身的方式,可以轻松构建多层嵌套的树形结构。 <template> &l…

vue实现xss

vue实现xss

XSS 攻击简介 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中,当其他用户访问该页面时,脚本会在其浏览器中执行,可能导致数据泄露或会话劫持。 Vue 中的 XSS…

vue实现排序

vue实现排序

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

vue实现动态

vue实现动态

Vue 实现动态路由的方法 在 Vue 中实现动态路由通常涉及以下几个关键步骤: 使用 Vue Router 的动态路由匹配 通过 Vue Router 的 :param 语法可以实现动态路由匹配。…

vue实现全屏

vue实现全屏

Vue 实现全屏功能的方法 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 来实现。以下是几种常见的实现方式: 使用原生 Fullscreen API 通过调用 doc…

vue实现mui

vue实现mui

使用 Vue 实现 MUI(Material-UI)风格的界面 Vue 本身不直接提供 MUI(Material Design)组件,但可以通过集成第三方库或手动实现来达到类似效果。以下是几种常见方法…