前端权限管理方案之精确到按钮级别

这是产品提出的要求:

页面上的每一个按钮,都要可以通过角色权限来控制

  当时的项目背景是一个零售系统的后台管理,所以会涉及到运营、厂家、管理员等等很多角色的使用,而其中许多数据是敏感的,例如销量,单价,利润等。前期的权限仅限于菜单级别的控制,也就是可以通过配置实现可以控制某个角色只显示某些菜单,这也是比较常规的权限处理方案——没权限就不让你看那个页面呗~

****旧的按钮权限控制:****

//按钮根据角色写死是否有权限,灵活性很差,修改权限需要前端改代码,而且哪个按钮有权限纯靠阅读代码识别
<button disabled={role !== "admin"}>删除</button> //大致代码,角色为admin按钮才可用

  但目前的情况是菜单的控制在现有系统的背景下已经略显粗放了,比如有的人是可以看销售页面的,只是不允许他导出,又或者允许他新增一个商品,但是不允许他删除,所以呢要求虽然有点高,但是这个需求无疑是合理的。做过类似系统的朋友都应该了解,后管系统的列表类型页面,往往是增删改查集一体的,甚至还有导出、绑定、上传之类的操作。另一个前提是,实现按钮权限控制的同时之前菜单权限的控制也要保留支持。

****解决方案构思:****

方案一,既然某些操作是不允许的,是否可以将操作归类统一赋予角色权限呢,比如运营A角色无删除类权限,运营B角色有新增类权限,类似来归类实现管理。可落到实处,会发现操作很难归类,删除和修改其实是类似的,绑定解绑等操作更是无法准确分类;更大的问题是,有的角色是可以的删除A页面数据,但是不允许删除B页面数据的,而且这种方式灵活度也很低,比菜单好不到哪去,所以否掉。

方案二,摒弃按钮分类思想,给每个按钮赋予唯一code用于控制权限,管理角色权限直接勾选该角色是否激活某个code权限即可;拟定一个鉴权函数,入参数为code,该函数放置于每个按钮中,鉴权函数根据code是否在后端返回的该角色拥有code列表中,来判断返回是否具有权限,具有很高的灵活性,并且菜单也可以通过加code来实现同样效果,改动微小几乎只用增加一个鉴权函数即可实现核心逻辑。

最终采用方案二,在实际研发中,还做了优化:

1.将权限控制按层级分为模块,菜单,按钮3大层级,因为当整个模块都没有权限的时候,不必再判断按钮权限,提高性能,菜单亦如此。

2.code实际是用英文字符来表示,增强可读性,例如设备菜单是deviceMenu,而不是无意义的id。

3.实际鉴权函数入参为模块,菜单,按钮3个参数,更好理解也更加符合直觉,模块下有多个菜单,菜单下有多个按钮,也就是说几乎每个添加按钮都可以取名“add”,不必担心重复。

4.将列表字段当按钮处理,甚至可以实现同一列表每个字段的权限控制,例如部分敏感价格字段显示为**(当然安全性不高)

5.后端只需返回当前用户角色拥有的全部模块,菜单,按钮code即可

具体实现核心代码如下

// 给菜单路由增加code标识,后续根据角色拥有菜单情况遍历剔除无权限菜单即可
        {
            path: 'model',
            name: 'DeviceModelList',
            code: 'device_model',//  菜单仅在原路由增加code,改动很小
            meta: {
                title: '设备型号',
                icon: 'md-menu'
            },
            component: () => import('@/views/DeviceModelList')
        }
// 给按钮增加函数鉴权,此处是采用禁用点击,也可以使用if直接不显示
    <Button:disabled="!checkButtonPower('device','device_list','add')">添加设备</Button>
// 鉴权函数,判断模块和菜单就不用传第二,三个参数即可(当时的代码实在是不够优雅啊)
    checkButtonPower(modelCode, menuCode, buttonCode) {
    let powerStatus = false
    //取出权限列表
    const isGetPower = localStorage.getItem('userPower')
    const powerList = isGetPower ? base64.decryptAsObj(isGetPower) : null
    for (const modes of powerList) {
        if (!!modes.menuCode && modes.menuCode == modelCode) {
            for (const menus of modes.childMenu) {
                if (!!menus.menuCode && menus.menuCode == menuCode) {
                    for (const buttons of menus.buttons) {
                        if (!!buttons.code && buttons.code == buttonCode) {
                            powerStatus = true
                        }
                    }
                }
            }
        }
    }
    return powerStatus
   },

至此,功能实现,如有疑问欢迎留言
PS:后续实现后发现Vben-admin也是用的类似的思路实现了细粒度的权限管理,思路没错~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容