前端权限控制实战:手把手教你玩转角色权限分配

今天想和大家聊聊项目中经常遇到的权限控制问题,尤其是角色权限分配这个让很多新手头疼的话题。

为什么我们需要权限控制?

记得我刚入行时接手的第一个后台管理系统项目,所有页面和功能对所有用户开放,结果测试同事用普通账号把管理员功能玩了个遍...(捂脸)从那以后我就明白了:权限控制不是可选项,而是必选项

权限设计的核心思路

1. 权限模型:RBAC

目前最主流的是RBAC(Role-Based Access Control) 模型,也就是基于角色的访问控制。简单来说就是:

  • 用户关联角色
  • 角色关联权限
  • 权限决定你能干什么

就像游戏里的设定:

  • 普通玩家:只能打怪
  • 公会会长:可以踢人
  • GM:为所欲为

2. 前端权限控制三板斧

在实际项目中,我们通常需要控制:

  1. 页面权限:能不能进入这个路由
  2. 操作权限:按钮/功能能不能用
  3. 内容权限:能看到哪些数据

代码实战:Vue中的权限实现

路由权限控制

首先我们定义路由时加上meta信息:

const routes = [
  {
    path: '/dashboard',
    component: Dashboard,
    meta: { requiredRoles: ['admin', 'editor'] }
  },
  {
    path: '/user-manage',
    component: UserManage,
    meta: { requiredRoles: ['admin'] }
  }
]

然后在路由守卫里做校验:

router.beforeEach((to, from, next) => {
  const myRoles = store.getters.roles // 获取我的角色
  
  if (to.meta.requiredRoles) {
    if (myRoles.some(role => to.meta.requiredRoles.includes(role))) {
      next()
    } else {
      next('/403') // 无权限页面
    }
  } else {
    next()
  }
})

按钮权限控制

我们可以封装一个权限指令:

// v-permission指令
Vue.directive('permission', {
  inserted(el, binding, vnode) {
    const { value } = binding
    const myRoles = store.getters.roles
    
    if (value && value instanceof Array) {
      const hasPermission = myRoles.some(role => {
        return value.includes(role)
      })
      
      if (!hasPermission) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else {
      throw new Error('需要传入角色数组,例如v-permission="['admin']"')
    }
  }
})

使用起来很简单:

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

动态菜单实现

根据权限动态生成侧边栏菜单:

// 过滤有权限的路由
function filterRoutes(routes, roles) {
  return routes.filter(route => {
    if (route.meta && route.meta.requiredRoles) {
      return roles.some(role => route.meta.requiredRoles.includes(role))
    }
    return true
  })
}

// 在vuex中使用
const filteredRoutes = filterRoutes(asyncRoutes, myRoles)
router.addRoutes(filteredRoutes)

性能优化小技巧

  1. 按需加载权限数据:只在用户登录后获取权限信息
  2. 缓存权限校验结果:避免重复计算
  3. 服务端校验兜底:前端校验只是提高体验,关键操作必须服务端再校验

我踩过的坑

  1. 动态路由刷新丢失:解决方案是存到vuex并在刷新时重新addRoutes
  2. 权限变更不及时:可以在用户信息变更时主动更新权限数据
  3. 按钮权限颗粒度:不要过度控制,否则维护成本很高

总结

权限控制就像给系统穿上合身的衣服 - 不能太紧影响活动,也不能太松走光。找到适合项目的平衡点很重要。希望我的这些经验能帮你少走弯路!

原文: https://juejin.cn/post/7532010960083353663
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值