前端vue实现不同权限
权限控制实现方案
在Vue项目中实现权限控制通常涉及路由权限、页面元素权限和API权限三个层面。以下是常见的实现方法:
路由权限控制
基于用户角色或权限动态生成可访问路由表。在路由守卫中进行权限校验:
// router/index.js
router.beforeEach((to, from, next) => {
const hasToken = localStorage.getItem('token')
const userRole = getUserRole() // 获取用户角色
if (to.meta.requiresAuth && !hasToken) {
next('/login')
} else if (to.meta.roles && !to.meta.roles.includes(userRole)) {
next('/403') // 无权限页面
} else {
next()
}
})
动态菜单生成
根据权限数据动态生成侧边栏菜单:
// 过滤异步路由表
function filterAsyncRoutes(routes, roles) {
return routes.filter(route => {
if (route.meta && route.meta.roles) {
return roles.some(role => route.meta.roles.includes(role))
} else {
return true
}
})
}
组件级权限控制
创建自定义指令控制按钮级权限:
// directives/permission.js
Vue.directive('permission', {
inserted(el, binding) {
const { value } = binding
const permissions = store.getters.permissions
if (value && !permissions.includes(value)) {
el.parentNode && el.parentNode.removeChild(el)
}
}
})
使用方式:
<button v-permission="'user:add'">添加用户</button>
权限数据管理
建议使用Vuex集中管理权限状态:
// store/modules/permission.js
const state = {
routes: [],
addRoutes: []
}
const mutations = {
SET_ROUTES: (state, routes) => {
state.addRoutes = routes
state.routes = constantRoutes.concat(routes)
}
}
API权限控制
在请求拦截器中添加权限验证:
// utils/request.js
service.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers['X-Token'] = getToken()
}
return config
},
error => {
return Promise.reject(error)
}
)
最佳实践建议
- 权限数据应存储在服务端,前端只做展示层控制
- 敏感操作必须经过服务端二次验证
- 使用路由懒加载提升性能
- 对于复杂权限系统可考虑使用RBAC模型
- 定期审计权限分配情况
以上方案可根据实际项目需求组合使用,建议在开发初期就规划好权限系统架构,避免后期重构带来额外成本。







