今天跟大家伙儿聊聊我最近在项目里瞎折腾的玩意儿,叫“阿扎德”,听着挺洋气,就是个代号,主要灵感来自于我之前看电影的时候,里面有个角色也叫这个,觉得挺顺口就拿来用了。
事情是这样的,我们组最近在搞一个新模块,涉及到用户权限管理,这块儿之前一直是个老大难问题,各种权限混乱,改起来牵一发动全身。我就寻思着能不能彻底重构一下,搞个更灵活、可扩展的方案。
说干就干,我先是花了几天时间把现有的权限逻辑扒了个底朝天,简直就是一坨意大利面,各种if-else,看得我脑瓜疼。然后开始调研各种权限模型,什么RBAC、ACL、ABAC,看得我眼花缭乱。决定,借鉴一下RBAC(基于角色的访问控制)的思想,但是要做一些定制化的改造。
我定义了一套权限规则,把所有的操作都抽象成一个个的权限点,比如“查看用户”、“编辑用户”、“删除用户”等等。然后,定义了一系列的角色,比如“管理员”、“普通用户”、“访客”等等。每个角色都拥有一组权限点。
接下来就是重头戏了,我用Python写了个权限引擎,这个引擎的核心功能就是判断用户是否有某个权限。它的工作流程是这样的:
1. 用户发起一个操作请求。
2. 权限引擎接收到请求,获取用户的角色信息。
3. 权限引擎根据用户的角色信息,查询该角色拥有的权限点。
4. 权限引擎判断用户请求的操作是否在角色的权限点列表中。
5. 如果用户拥有该权限,则允许操作,否则拒绝操作。
这个引擎写起来挺简单的,但是要考虑各种边界情况,比如角色继承、权限覆盖等等,还是花了我不少功夫。
写完引擎之后,我还做了一个权限管理界面,方便管理员配置角色和权限。这个界面用*写的,前后端分离,体验还不错。
遇到最大的坑:在实际使用过程中,我发现一个问题,就是权限的粒度太粗了。比如,“编辑用户”这个权限,如果只控制到这个级别,那管理员就可以编辑所有用户的信息,这显然是不行的。我们希望能够控制到更细的粒度,比如只能编辑某个部门的用户信息。
为了解决这个问题,我引入了“资源”的概念。每个权限点都对应一个资源,比如“用户”,然后给资源添加一些属性,比如“部门”。这样,我们就可以通过控制资源的属性来控制权限的粒度。
比如,我们可以定义一个权限规则:
“编辑用户” + “部门=技术部”
这个规则表示,只有拥有“编辑用户”权限,并且用户的部门是“技术部”的人,才能编辑技术部用户的信息。
这个方案虽然有点复杂,但是解决了权限粒度的问题,也提高了系统的灵活性。
效果:经过一段时间的迭代和优化,“阿扎德”总算是跑起来了。现在我们的权限管理变得清晰多了,也方便进行各种定制化的配置。虽然中间踩了不少坑,但是总算是有个结果了。
权限管理是个复杂的问题,要根据实际业务需求选择合适的方案。
RBAC是一种常用的权限模型,可以借鉴其思想,但是要做一些定制化的改造。
权限引擎是权限管理的核心,要考虑各种边界情况。
权限粒度要控制太粗了不行,太细了也不
持续迭代和优化,才能让权限管理系统更好地服务于业务。
这回折腾“阿扎德”的经历,让我对权限管理有了更深入的理解。以后有机会再跟大家分享一些其他的实践经验。
还没有评论,来说两句吧...