用户管理是每个产品必备的管理后台,最基础的用户管理只要有账号增删这两个功能就够了。不过一旦用户开始增多,权限稍微复杂一些,我们就需要认真思考用户管理权限的逻辑问题。避免在未来用户突然增长时,埋下无法解决的深坑。
如果你只是想找用户管理系统的源码,可以直接看文末结论部分。
基础权限系统的设计,一般都是从「用户-权限」这两个纬度开始的,管理员需要为每一个用户单独定义权限。
上图为 synology 服务器权限设置后台。服务器每新增一个访问账号,管理员就需要配置一遍权限表。如果系统中用户数在几十个上下,权限变动也不太多时,这种「用户-权限」的权限管理逻辑简单清晰,很好用。但当系统中用户开始增多,到达上千、上万时,此种管理方法的局限性就暴露出来了。
当用户数量到达一定规模后,管理员要修改一批用户的权限时,在「用户-权限」的模型中,几乎不可能手动完成。这时,我们在 用户 和 权限 之间引入 角色 这个概念。将用户与权限直接对的应关系,改为用户关联角色,角色关联权限的方式来赋予用户权限,即「用户-角色-权限」。
引入角色的好处是将抽象的权限具像化,我们仅需要思考每个角色应该赋予什么样的权限,再将对应的用户指向角色,即可完成账号授权。
「用户-角色-权限」的权限逻辑就是目前行业内普遍使用的 RBAC (Role-Based Access Control:基于角色的权限控制)权限模型。其核心是引入角色的概念,用角色作为中间介质,使用户与权限配置更加灵活。
(1)将抽象的权限具像化,分配权限时不用再思考抽象问题。
举例:新入职的初级销售小张找管理员开账号,管理员不用纠结到底要不要给小张开「查看部门销量」的权限,只需要把小张的账号指向「初级销售」的角色即可,这个角色有怎样的权限,早已被定义好。
(2)批量调整权限
举例:有时公司上新业务模块,管理员要授权某一属性的用户查看该模块数据。比如公司新上直播功能,需要运营组可以操作直播后台,此时管理员只需要修改「运营」这个角色的权限即可修改所有运营组成员的账号权限。
RBAC 权限模型清晰简单的管理逻辑非常好的体现在实际应用中,接下来我们通过具体的例子来理解这种权限架构的逻辑思路。
(1)RBAC基本型:「用户-角色-权限」
RBAC 的基础性仅含「用户-角色-权限」概念。在这个模型中,用户与角色,角色与权限是多对多的关系,用户的权限就是所属的全部角色拥有的权限之和。多数产品的用户管理,使用 RBAC 基本型即可完成很好的权限控制。
举个例子:公司小王即是财务部的出纳,又负责仓储保管清点货物。那么我们首先创建两个角色,财务部出纳,仓储部库管。角色非常具象,管理员可以轻松授权角色权限。再把小王的账号赋予这两个身份,小王在系统中就获得了对应的权限。权限模型逻辑简单干净。
(2)进入「等级」概念的 RBAC 模型 -「用户 - 角色 [等级] - 权限」
引入了「等级」概念,即角色内有了上下级关系。每个等级的权限不同,高等级向下兼容低等级权限,即在同一个角色内,高等级包含所有低等级的权限。「等级」概念的引入,让权限实现更细颗粒度的分配。
举个例子:所属同一个部门的员工并不应该人人都能查看全部门数据。所以这时我们引入「等级」的概念,部门负责人可查看全部门数据,部门中各小组组长只可查看自己小组数据,而组员,只能看自己的数据。
(3)「用户 - 角色 [等级] - 权限 [限制] 」
在权限控制中,为了系统的安全,也为了工作流程中逻辑的通畅,我们不仅赋予账号权利,也要对账号做系统层面的限制。
角色互斥
在某些业务流程中,前后角色是核对关系,如果让同一个人同时担任前后核查的角色,系统流程就可能出现安全漏洞。比如采购员与财务审核员,采购员申报采购计划,财务审核员审核通过采购计划。如果这两个角色是同一个人,那么他既能提交申请,又能通过申请。那么就失去了审核的意义。此时,我们应该限定系统中,采购与财务审核为互斥角色,不同由同一个账号同时拥有。
角色基数约束
在系统中,有些特殊角色,涉及到安全或责任问题,只能由一个人担任,所以我们要限制此类角色对应的用户数量为有限数。比如权限管理员或者部门负责人,不可以由多个用户担任,只能撤掉一个,再添加另一个。这样才能保证系统安全,流程稳固。
多角色用户仅允许同时使用一个角色
有时不同角色在同一操作界面会有数据或操作上的冲突,此时,我们要限定用户同一时间,只能使用一个身份。这样可以避免非常多不必要的麻烦。
RBAC 权限模型由三大部分构成,即用户管理、角色管理、**权限管理。**用户管理按照企业架构或业务线架构来划分,这些结构本身比较清晰,扩展性和可读性都非常好。角色管理一定要在深入理解业务逻辑后再来设计,一般使用各部门真实的角色作为基础,再根据业务逻辑进行扩展。权限管理是前两种管理的再加固,做太细容易太碎片,做太粗又不够安全,这里我们需要根据经验和实际情况来设计。
用户管理中的用户,是企业里每一位员工,他们本身就有自己的组织架构,我们可以直接使用企业部门架构或者业务线架构来作为线索,构建用户管理系统。
在设计系统角色时,我们应该深入理解公司架构、业务架构后,再根据需求设计角色及角色内的等级。一般角色相对于用户来说是固定不变的,每个角色都有自己明确的权限和限制,这些权限在系统设计之处就确定了,之后也轻易不会再变动。
(1)自动获得基础角色
当员工入职到某部门时,该名员工的账号应该自动被加入该部门对应的基础角色中,并拥有对应的基础权限。这种操作是为了保证系统安全的前提下,减少了管理员大量手动操作。使新入职员工能快速使用系统,提高工作效率。
(2)临时角色与失效时间
公司业务有时需要外援来支持,他们并不属于公司员工,也只是在某个时段在公司做支持。此时我们需要设置临时角色,来应对这种可能跨多部门协作的临时员工。
如果公司安全级别较高,此类账号默认有固定失效时间,到达失效时间需再次审核才能重新开启。避免临时账号因为流程不完善,遗忘在系统中,引起安全隐患。
(3)虚拟角色
部门角色中的等级,可以授权同等级的员工拥有相同的权限,但某些员工因工作原因,需要调用角色等级之外的权限,相同等级不同员工需要使用的权限还不相同。这种超出角色等级又合理的权限授予,我们可以设置虚拟角色。这一虚拟角色可集成这一工作所需的所有权限,然后将它赋予具体的员工即可。这样即不用调整组织架构和对应的角色,也可以满足工作中特殊情况的权限需求。
(4)黑白名单
权限管理一般从三个方面来做限制。页面/菜单权限,操作权限,数据权限。
(1)页面/菜单权限
对于没有权限操作的用户,直接隐藏对应的页面入口或菜单选项。这种方法简单快捷直接,对于一些安全不太敏感的权限,使用这种方式非常高效。
(2)操作权限
操作权限通常是指对同一组数据,不同的用户是否可以增删改查。对某些用户来说是只读浏览数据,对某些用户来说是可编辑的数据。
(3)数据权限
对于安全需求高的权限管理,仅从前端限制隐藏菜单,隐藏编辑按钮是不够的,还需要在数接口上做限制。如果用户试图通过非法手段编辑不属于自己权限下的数据,服务器端会识别、记录并限制访问。
超级管理员是用来启动系统,配置系统的账号。这个账号应该在配置好系统,创建管理员之后被隐藏起来。超级管理员账号拥有系统中全部权限,可穿梭查看各部门数据,如果使用不恰当,是系统管理的安全隐患。
当用户已经有用的角色和即将添加的角色互相互斥时,应该在添加新角色时,提示管理员因角色互斥的原因,无法进行新角色添加。如需添加,要先撤销掉前一个角色,再添加新角色。
在设计权限系统之处,一定要理清思路,一切从简,能不增加的多余角色和权限逻辑,就一定不要增加。因为随着公司业务的扩大,权限和角色也会随之增多,如果初期设计思路不严谨,那么权限系统会随着业务的扩大而无限混乱下去,此时再来整理权限,已经太晚了。所以初期设计就一定要条理清晰,简单明了,能避免后续非常多不必要的麻烦。
有时员工 A 会直接给员工 B 分享他当下正在操作的页面,但有可能员工 B 无权查看。此时我们应该在这里考虑添加「无权提示页」,避免粗暴的404页面让员工 B 以为是系统出错了。
用户权限管理系统,设计起来虽然复杂,但只要产品逻辑理顺,页面设计完成,使用趁手的工具,很快就能完成管理系统的搭建和部署。
这里我推荐大家试试卡拉云,卡拉云是一套帮助后端程序员解决了数据库接入、API 调用等问题,前端组件拖放即用,可快速构建企业内部工具。
我用卡拉云按照本文思路,搭建了一套用户权限管理系统,仅花了1天时间。我已经将在卡拉云搭建好的用户管理系统生成为模版,即可快速复制我的模版到你的账号下,立即套用,接入自己的数据,完成部署。
卡拉云可轻松接入常见的数据库和 API ,只需简单配置,即可完成数据对接。
(1)快速搭建用户管理系统后端工具 - 卡拉云
(2)常用的权限系统模型
(3)由 George Mason 大学提出的 RBAC 模型文档
蒋川,卡拉云联合创始人,B 端产品经理,专注研究企业内部效率工具实施搭建
我的微信 HiJiangChuan,欢迎一起交流。
卡拉云 - 快速搭建企业内部工具的低代码开发平台,只要会写SQL,即可快速上手。
欢迎访问我们的网站「卡拉云」,了解更多信息。