
话说回来,干我们这行,权限系统这玩意儿是绕不过去的坎儿。以前我那套老系统,就是简单的“你是管理员吗?”或者“你是普通用户吗?”然后一堆 if else 写死在代码里。那...
话说回来,干我们这行,权限系统这玩意儿是绕不过去的坎儿。以前我那套老系统,就是简单的“你是管理员吗?”或者“你是普通用户吗?”然后一堆 if else 写死在代码里。那叫一个难维护!
产品经理屁大点需求一改,我就得跟着改一堆代码。实在受不了了,新项目我决定自己动手,彻底重构一套权限体系。我这人嘛要搞就搞得清清楚楚。
一开始就两个选择摆在我面前:RBAC(基于角色的那个,老外叫Role-Based Access Control)和ABAC(基于属性的那个,叫Attribute-Based Access Control)。
我先去拉了几个资料看。RBAC看起来最简单,就是把人分成几拨,比如老板、主管、普通员工,然后给每拨人分配权限。这多好理解,PM也能懂。我快速搭了一个RBAC的架子。
实在受不了角色的爆炸式增长,我又把目光转向了ABAC。这玩意儿可就厉害了。它是靠“属性”来判断权限,比如“如果用户是主管,并且他所在部门和资源所在部门一样,并且操作是只读,就放行”。

我花了好几天时间去琢磨,这简直就是把权限规则写成一堆逻辑判断。确实强大,理论上任何复杂的权限都能实现。但是:
一番折腾后,我得出了一个结论:纯粹追求“最好用”的模型,往往会陷入困境。得看你的业务和团队能力!
我们那个Wares Management System,功能权限(比如谁能点“删除”按钮)是比较固定的,用RBAC管得妥妥的。但数据权限(比如张三只能看自己区域的销售单)却很灵活,这是RBAC的痛点。

所以我采取了一个折中的办法,也是我目前用着最顺手的:
我保留了RBAC的主体框架,用来管理功能菜单和按钮这种粗粒度的权限。这是骨架,是给PM看的配置界面。
然后,我偷偷摸摸在数据查询层面,加了一层简单的属性判断。比如,给用户或者角色多加一个“数据范围”的属性(全国、华东、自己部门)。当他查询数据时,我就去查一下这个属性,然后默默地给他的SQL语句或者API请求加上一个过滤条件。
这不就实现了大部分ABAC想要干的“数据权限”了吗?而且不复杂,就多了个属性字段和后台的过滤代码。完全没有引入复杂的规则引擎。
现在回过头来看,这个“RBAC主体 + 简单属性过滤”的混搭方式,简直是省心省力。
它保留了RBAC那种简单配置、容易理解的优点,同时又解决了纯RBAC搞不定数据权限的痛点。后期的维护工作量,起码给我少了一半。实践证明,够用、稳定,能让PM和自己都舒服的,就是最好用的!