镣铐束缚了什么?揭秘你不知道的真相与挣脱方法

tmyb
广告

说起这个“镣铐束缚”,是我最近在搞一个权限管理项目时候遇到的一个难题。这名字也是我自己起的,因为真的感觉被各种限制条件给束缚住了,动弹不得。

事情是这样的,一开始接到这个需求,觉得也没不就是个权限嘛CRUD一套下来,应该很快就能搞定。结果一上手,发现事情没那么简单。

镣铐束缚了什么?揭秘你不知道的真相与挣脱方法

用户角色特别多,各种各样的,细分到我头皮发麻。然后,每个角色对应的权限又不一样,而且还经常变动,今天说这个角色需要加个权限,明天又说那个角色要删个权限。最要命的是,这些权限还不是简单的“有”或者“没有”,有些权限还需要控制到具体的字段级别,比如某个角色只能看某个字段,不能修改。

我当时就懵了,这要是用传统的方式来做,那得写多少代码?而且以后维护起来,那简直就是一场噩梦。想想就觉得头大。

所以我就开始各种查资料,找方案。一开始想的是用RBAC(Role-Based Access Control),就是基于角色的权限控制。但是RBAC对于这种复杂的权限场景,感觉还是有点力不从心。

镣铐束缚了什么?揭秘你不知道的真相与挣脱方法

后来又看到了ABAC(Attribute-Based Access Control),就是基于属性的权限控制。这个感觉有点靠谱,它可以根据用户的属性、资源的属性、环境的属性等等,来动态的判断是否有权限。

于是我就开始研究ABAC,找了一些开源的ABAC引擎,试着用了一下,发现确实可以解决我的一些问题。但是,这些引擎要么太重了,要么太复杂了,用起来不是很方便。

没办法,只能自己动手了。我就开始自己设计一个简单的ABAC引擎。

镣铐束缚了什么?揭秘你不知道的真相与挣脱方法

第一步,我定义了一套规则引擎,用JSON来描述权限规则。比如:

  • 如果用户是“管理员”,并且访问的资源是“用户管理”,那么就允许访问。
  • 如果用户是“普通用户”,并且访问的资源是“个人信息”,那么就允许访问,但是只能查看“姓名”和“邮箱”字段。
  • 镣铐束缚了什么?揭秘你不知道的真相与挣脱方法

第二步,我实现了一个规则解析器,它可以把这些JSON规则解析成可执行的代码。

第三步,我实现了一个权限判断器,它可以根据用户的属性、资源的属性和环境的属性,以及解析后的规则,来判断用户是否有权限。

整个过程说起来简单,但是做起来真的不容易。各种踩坑,各种调试。

镣铐束缚了什么?揭秘你不知道的真相与挣脱方法

比如,一开始我用的是Python来实现的,但是发现性能有点差,后来改成了Go。

又比如,在规则的定义上,一开始我想的太简单了,只考虑了一些简单的场景,后来发现各种各样的特殊情况都要考虑进去,规则变得越来越复杂。

还有,在权限判断上,一开始我只考虑了“允许”和“拒绝”两种情况,后来发现还需要考虑“部分允许”的情况,比如允许查看部分字段,但不允许修改。

镣铐束缚了什么?揭秘你不知道的真相与挣脱方法

整个过程就是一个不断迭代,不断完善的过程。

经过一段时间的努力,终于把这个简单的ABAC引擎给搞出来了。虽然还不是很完善,但是基本可以满足我的需求了。

我可以把各种各样的权限规则都定义成JSON,然后交给引擎去判断。这样,我就不用写大量的代码来处理权限逻辑了。而且以后权限变动的时候,只需要修改JSON规则就可以了,不用修改代码。

镣铐束缚了什么?揭秘你不知道的真相与挣脱方法

虽然这个过程很痛苦,感觉被各种“镣铐”束缚,但是最终还是克服了困难,解决了问题。而且在这个过程中,我也学到了很多东西,对权限管理有了更深刻的理解。

我觉得,有时候遇到困难,不要害怕,要勇敢的面对它,想办法解决它。只有这样,才能不断的成长,不断的进步。

这个项目还有很多需要改进的地方,比如性能优化,规则的图形化管理等等。以后有时间,我会继续完善它。也欢迎大家给我提意见,一起交流学习。

镣铐束缚了什么?揭秘你不知道的真相与挣脱方法

就分享到这里,希望对大家有所帮助。