vue如何实现权限
Vue 实现权限控制的常用方法
路由权限控制
通过 Vue Router 的导航守卫实现路由级别的权限控制,在路由配置中添加 meta 字段定义所需权限。
const router = new VueRouter({
routes: [
{
path: '/admin',
component: Admin,
meta: { requiresAuth: true, roles: ['admin'] }
}
]
})
router.beforeEach((to, from, next) => {
const userRoles = getUserRoles() // 获取用户角色
if (to.meta.roles && !to.meta.roles.some(role => userRoles.includes(role))) {
next('/forbidden') // 无权限跳转
} else {
next()
}
})
动态路由生成
根据用户权限动态生成可访问的路由表,通常结合后端返回的权限数据。
// 过滤有权限的路由
function filterRoutes(allRoutes, userPermissions) {
return allRoutes.filter(route => {
if (route.meta && route.meta.permissions) {
return route.meta.permissions.some(perm =>
userPermissions.includes(perm)
)
}
return true
})
}
组件级权限控制
创建自定义指令或组件实现元素级别的权限控制。
// 注册全局指令
Vue.directive('permission', {
inserted: function(el, binding) {
const userPermissions = store.getters.permissions
if (!userPermissions.includes(binding.value)) {
el.parentNode.removeChild(el)
}
}
})
// 使用方式
<button v-permission="'user_delete'">删除用户</button>
权限工具函数
创建可复用的权限检查函数,用于业务逻辑中的权限判断。
// 权限检查工具
export function checkPermission(requiredPermissions) {
const userPermissions = store.getters.permissions
return requiredPermissions.every(perm =>
userPermissions.includes(perm)
)
}
// 使用示例
if (checkPermission(['user_edit'])) {
// 执行有权限的操作
}
API 请求拦截
在 axios 拦截器中添加权限验证,防止无权限的 API 调用。
axios.interceptors.request.use(config => {
const token = localStorage.getItem('token')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
}, error => {
return Promise.reject(error)
})
状态管理集成
将权限数据存储在 Vuex 中集中管理,便于全局访问和更新。
const store = new Vuex.Store({
state: {
permissions: []
},
mutations: {
SET_PERMISSIONS(state, permissions) {
state.permissions = permissions
}
},
actions: {
fetchPermissions({ commit }) {
return api.getPermissions().then(res => {
commit('SET_PERMISSIONS', res.data)
})
}
}
})
按钮权限组件
创建权限按钮组件,统一处理按钮的权限和禁用状态。
Vue.component('permission-button', {
props: {
permission: String,
disabled: Boolean
},
computed: {
hasPermission() {
return this.$store.getters.permissions.includes(this.permission)
}
},
template: `
<button
:disabled="!hasPermission || disabled"
v-on="$listeners"
>
<slot></slot>
</button>
`
})
以上方法可以单独使用或组合使用,具体选择取决于项目需求和复杂度。对于中小型项目,路由守卫和自定义指令通常足够;大型企业级应用可能需要结合动态路由和状态管理实现更精细的权限控制。







