当前位置:首页 > VUE

vue实现前端权限

2026-03-08 19:47:27VUE

Vue 前端权限实现方案

基于路由的权限控制

通过路由守卫(router.beforeEach)实现动态路由过滤,结合用户角色或权限列表控制可访问的路由。

// 路由配置示例
const routes = [
  { path: '/admin', component: Admin, meta: { requiresAuth: true, roles: ['admin'] }},
  { path: '/user', component: User, meta: { requiresAuth: true }}
]

// 路由守卫逻辑
router.beforeEach((to, from, next) => {
  const userRoles = store.getters.roles
  if (to.meta.roles && !to.meta.roles.some(role => userRoles.includes(role))) {
    next('/forbidden')
  } else {
    next()
  }
})

组件级权限控制

使用自定义指令v-permission实现按钮/组件级别的权限控制。

vue实现前端权限

// 注册全局指令
Vue.directive('permission', {
  inserted(el, binding, vnode) {
    const { value } = binding
    const permissions = store.getters.permissions

    if (value && !permissions.includes(value)) {
      el.parentNode && el.parentNode.removeChild(el)
    }
  }
})

// 模板中使用
<button v-permission="'user:delete'">删除用户</button>

权限数据管理

使用Vuex存储用户权限信息,保持状态集中管理。

// Vuex store示例
const store = new Vuex.Store({
  state: {
    permissions: [],
    roles: []
  },
  mutations: {
    SET_PERMISSIONS(state, permissions) {
      state.permissions = permissions
    }
  },
  actions: {
    async fetchPermissions({ commit }) {
      const res = await api.getPermissions()
      commit('SET_PERMISSIONS', res.data)
    }
  }
})

动态菜单渲染

根据权限数据动态生成导航菜单,过滤无权限的菜单项。

vue实现前端权限

// 菜单过滤方法
function filterMenus(menus, permissions) {
  return menus.filter(menu => {
    if (menu.children) {
      menu.children = filterMenus(menu.children, permissions)
    }
    return !menu.meta?.permission || permissions.includes(menu.meta.permission)
  })
}

API请求拦截

在axios拦截器中添加权限验证,拦截无权限的请求。

// axios请求拦截
axios.interceptors.request.use(config => {
  const token = store.getters.token
  if (token) {
    config.headers['Authorization'] = `Bearer ${token}`
  }
  return config
})

// 响应拦截处理权限错误
axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 403) {
      router.push('/forbidden')
    }
    return Promise.reject(error)
  }
)

权限初始化流程

应用启动时获取用户权限信息并初始化权限系统。

// 应用入口文件
async function initApp() {
  await store.dispatch('user/getInfo')
  await store.dispatch('permission/generateRoutes')
  router.addRoutes(store.getters.addRouters)
  new Vue({ router, store }).$mount('#app')
}

注意事项

  • 前端权限控制需与后端验证配合使用,不能替代后端权限验证
  • 敏感操作必须通过后端API进行二次验证
  • 权限数据建议加密存储或通过HTTP Only Cookie保护
  • 动态路由方案需考虑路由缓存和页面刷新问题

以上方案可根据实际项目需求进行组合或调整,建议采用RBAC(基于角色的访问控制)模型设计权限系统。

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

相关文章

vue公共列表的实现

vue公共列表的实现

实现 Vue 公共列表组件 公共列表组件通常用于展示重复结构的数据,例如商品列表、用户列表等。以下是一个典型的实现方式: 基础实现 创建可复用的列表组件 List.vue: <tem…

vue实现递归

vue实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据(如菜单、评论列表、文件目录等)。以下是具体实现方法: 定义递归组件 通过 name 选项让组件可以递归调用自身:…

vue实现拍照

vue实现拍照

Vue实现拍照功能 在Vue中实现拍照功能通常需要结合浏览器的MediaDevices API和Canvas元素。以下是具体实现方法: 安装依赖(可选) 如果需要更简单的封装,可以安装vue-web…

vue实现picker

vue实现picker

Vue 实现 Picker 组件的方法 在 Vue 中实现 Picker 组件可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 HTML 和 CSS 实现 通过 Vue 的模板和样式绑定,…

vue实现换肤

vue实现换肤

使用 CSS 变量实现换肤 在 Vue 项目中,可以通过 CSS 变量(Custom Properties)动态切换主题色。CSS 变量可以在运行时修改,适合实现换肤功能。 定义全局 CSS 变量:…

vue实现拖动

vue实现拖动

Vue实现拖动的常用方法 在Vue中实现拖动功能通常需要结合HTML5的拖放API或第三方库。以下是几种常见实现方式: 使用HTML5原生拖放API HTML5提供了原生拖放API,可以通过drag…