当前位置:首页 > VUE

vue操作权限管理实现

2026-02-24 07:17:18VUE

Vue 权限管理实现方法

基于路由的权限控制

在 Vue 项目中,可以通过路由守卫来实现权限控制。在路由配置中为每个路由添加 meta 字段,定义需要的权限。

const routes = [
  {
    path: '/admin',
    component: AdminPage,
    meta: { requiresAuth: true, roles: ['admin'] }
  },
  {
    path: '/user',
    component: UserPage,
    meta: { requiresAuth: true, roles: ['user', 'admin'] }
  }
]

在全局前置守卫中检查用户权限:

router.beforeEach((to, from, next) => {
  const userRole = store.getters.userRole
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!userRole) {
      next('/login')
    } else if (to.matched.some(record => record.meta.roles.includes(userRole))) {
      next()
    } else {
      next('/403')
    }
  } else {
    next()
  }
})

基于指令的权限控制

创建自定义指令来控制元素的显示:

Vue.directive('permission', {
  inserted: function(el, binding, vnode) {
    const userRoles = vnode.context.$store.getters.userRoles
    if (!userRoles.includes(binding.value)) {
      el.parentNode.removeChild(el)
    }
  }
})

在模板中使用:

<button v-permission="'admin'">管理员按钮</button>

基于组件的权限控制

创建权限组件封装权限逻辑:

const Permission = {
  functional: true,
  render: function(createElement, context) {
    const userRoles = context.parent.$store.getters.userRoles
    const requiredRoles = context.props.roles
    if (requiredRoles.some(role => userRoles.includes(role))) {
      return context.slots().default
    }
    return null
  }
}

注册并使用:

Vue.component('Permission', Permission)
<permission :roles="['admin']">
  <button>管理员专属按钮</button>
</permission>

动态菜单生成

根据用户权限动态生成菜单:

computed: {
  filteredRoutes() {
    return this.$router.options.routes.filter(route => {
      return !route.meta || 
             !route.meta.roles || 
             route.meta.roles.includes(this.$store.getters.userRole)
    })
  }
}

在模板中渲染过滤后的路由:

<nav>
  <router-link 
    v-for="route in filteredRoutes" 
    :key="route.path" 
    :to="route.path"
  >
    {{ route.name }}
  </router-link>
</nav>

API 请求权限控制

在请求拦截器中添加权限验证:

axios.interceptors.request.use(config => {
  const token = store.getters.token
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, error => {
  return Promise.reject(error)
})

axios.interceptors.response.use(response => {
  return response
}, error => {
  if (error.response.status === 401) {
    store.dispatch('logout')
    router.push('/login')
  }
  return Promise.reject(error)
})

状态管理集成

在 Vuex 中管理权限状态:

const store = new Vuex.Store({
  state: {
    user: null,
    roles: []
  },
  mutations: {
    setUser(state, { user, roles }) {
      state.user = user
      state.roles = roles
    },
    clearUser(state) {
      state.user = null
      state.roles = []
    }
  },
  actions: {
    login({ commit }, credentials) {
      return api.login(credentials).then(response => {
        commit('setUser', {
          user: response.data.user,
          roles: response.data.roles
        })
      })
    },
    logout({ commit }) {
      commit('clearUser')
    }
  },
  getters: {
    hasRole: state => role => {
      return state.roles.includes(role)
    }
  }
})

按钮级别权限控制

创建权限混入:

export default {
  methods: {
    $can(permission) {
      return this.$store.getters.userPermissions.includes(permission)
    }
  }
}

在组件中使用:

vue操作权限管理实现

import permissionMixin from './permissionMixin'

export default {
  mixins: [permissionMixin],
  methods: {
    deleteItem() {
      if (this.$can('delete')) {
        // 执行删除操作
      }
    }
  }
}

标签: 权限操作
分享给朋友:

相关文章

vue操作日志实现

vue操作日志实现

Vue 操作日志实现方案 方案一:基于拦截器的前端日志记录 通过封装 Axios 请求拦截器和响应拦截器,自动记录用户操作。这种方式适合记录 API 调用相关的操作。 // 在 axios 拦截器…

vue怎么实现权限

vue怎么实现权限

Vue 权限实现方法 路由权限控制 使用 vue-router 的 beforeEach 钩子进行路由拦截,结合用户角色或权限列表过滤可访问路由。 router.beforeEach((to, fr…

vue实现权限登录

vue实现权限登录

权限登录实现方案 在Vue中实现权限登录通常涉及前端路由控制、接口权限验证和动态菜单生成。以下是具体实现方法: 登录认证流程 用户提交登录表单后,向后端发送认证请求 axios.post('/ap…

vue的权限控制实现

vue的权限控制实现

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

Vue怎么实现权限验证

Vue怎么实现权限验证

Vue权限验证实现方法 路由守卫验证 在router.js中配置全局前置守卫,通过meta字段标记路由权限要求。检查用户权限是否匹配,未匹配则跳转到登录页或403页面。 router.beforeE…

vue中实现权限控制

vue中实现权限控制

路由权限控制 通过路由守卫实现页面级别的权限控制,在router.beforeEach中校验用户权限。定义路由时添加meta字段标记所需权限: const routes = [ { pa…