系统权限设计推荐?超级全面的权限系统设计方案

【菜科解读】
权限管理是所有后台系统的都会涉及的一个重要组成部分,主要目的是对不同的人访问资源进行权限的控制,菜叶说说,避免因权限控制缺失或操作不当引发的风险问题,如操作错误,隐私数据泄露等问题。
目前在公司负责权限这块,所以对权限这块的设计比较熟悉,公司采用微服务架构,权限系统自然就独立出来了,其他业务系统包括商品中心,订单中心,用户中心,仓库系统,小程序,多个APP等十几个系统和终端
1.权限模型
迄今为止最为普及的权限设计模型是RBAC模型,基于角色的访问控制(Role-Based Access Control)
1.1 RBAC0模型
RBAC0模型如下:
这是权限最基础也是最核心的模型,它包括用户/角色/权限,其中用户和角色是多对多的关系,角色和权限也是多对多的关系。
用户是发起操作的主体,按类型分可分为2B和2C用户,可以是后台管理系统的用户,可以是OA系统的内部员工,也可以是面向C端的用户,比如阿里云的用户。
角色起到了桥梁的作用,连接了用户和权限的关系,每个角色可以关联多个权限,同时一个用户关联多个角色,那么这个用户就有了多个角色的多个权限。
有人会问了为什么用户不直接关联权限呢?在用户基数小的系统,比如20个人的小系统,管理员可以直接把用户和权限关联,工作量并不大,选择一个用户勾选下需要的权限就完事了。
但是在实际企业系统中,用户基数比较大,其中很多人的权限都是一样的,就是个普通访问权限,如果管理员给100人甚至更多授权,工作量巨大。
这就引入了"角色(Role)"概念,一个角色可以与多个用户关联,管理员只需要把该角色赋予用户,那么用户就有了该角色下的所有权限,这样设计既提升了效率,也有很大的拓展性。
权限是用户可以访问的资源,包括页面权限,操作权限,数据权限:
页面权限:
即用户登录系统可以看到的页面,由菜单来控制,菜单包括一级菜单和二级菜单,只要用户有一级和二级菜单的权限,那么用户就可以访问页面
操作权限:
即页面的功能按钮,包括查看,新增,修改,删除,审核等,用户点击删除按钮时,后台会校验用户角色下的所有权限是否包含该删除权限,如果是,就可以进行下一步操作,反之提示无权限。
有的系统要求"可见即可操作",意思是如果页面上能够看到操作按钮,那么用户就可以操作,要实现此需求,这里就需要前端来配合,前端开发把用户的权限信息缓存,在页面判断用户是否包含此权限,如果有,就显示该按钮,如果没有,就隐藏该按钮。
某种程度上提升了用户体验,但是在实际场景可自行选择是否需要这样做
数据权限:
数据权限就是用户在同一页面看到的数据是不同的,比如财务部只能看到其部门下的用户数据,采购部只看采购部的数据,在一些大型的公司,全国有很多城市和分公司,比如杭州用户登录系统只能看到杭州的数据,上海用户只能看到上海的数据,解决方案一般是把数据和具体的组织架构关联起来.
举个例子,再给用户授权的时候,用户选择某个角色同时绑定组织如财务部或者合肥分公司,那么该用户就有了该角色下财务部或合肥分公司下的的数据权限。
以上是RBAC的核心设计及模型分析,此模型也叫做RBAC0,而基于核心概念之上,RBAC还提供了扩展模式。
包括RBAC1,RBAC2,RBAC3模型。
下面介绍这三种类型
1.2 RBAC1模型
此模型引入了角色继承(Hierarchical Role)概念,即角色具有上下级的关系,角色间的继承关系可分为一般继承关系和受限继承关系。
一般继承关系仅要求角色继承关系是一个绝对偏序关系,允许角色间的多继承。
而受限继承关系则进一步要求角色继承关系是一个树结构,实现角色间的单继承。
这种设计可以给角色分组和分层,一定程度简化了权限管理工作。
1.3 RBAC2模型
基于核心模型的基础上,进行了角色的约束控制,RBAC2模型中添加了责任分离关系,其规定了权限被赋予角色时,或角色被赋予用户时,以及当用户在某一时刻激活一个角色时所应遵循的强制性规则。
责任分离包括静态责任分离和动态责任分离。
主要包括以下约束:
#p#分页标题#e#互斥角色: 同一用户只能分配到一组互斥角色集合中至多一个角色,支持责任分离的原则。
互斥角色是指各自权限互相制约的两个角色。
比如财务部有会计和审核员两个角色,他们是互斥角色,那么用户不能同时拥有这两个角色,体现了职责分离原则
基数约束: 一个角色被分配的用户数量受限;一个用户可拥有的角色数目受限;同样一个角色对应的访问权限数目也应受限,以控制高级权限在系统中的分配
先决条件角色: 即用户想获得某上级角色,必须先获得其下一级的角色
1.4 RBAC3模型
即最全面的权限管理,它是基于RBAC0,将RBAC1和RBAC2进行了整合
1.5 用户组
当平台用户基数增大,角色类型增多时,而且有一部分人具有相同的属性,比如财务部的所有员工,如果直接给用户分配角色,管理员的工作量就会很大,如果把相同属性的用户归类到某用户组,那么管理员直接给用户组分配角色,用户组里的每个用户即可拥有该角色,以后其他用户加入用户组后,即可自动获取用户组的所有角色,退出用户组,同时也撤销了用户组下的角色,无须管理员手动管理角色。
根据用户组是否有上下级关系,可以分为有上下级的用户组和普通用户组:
具有上下级关系的用户组: 最典型的例子就是部门和职位,可能多数人没有把部门职位和用户组关联起来吧。
当然用户组是可以拓展的,部门和职位常用于内部的管理系统,如果是面向C端的系统,比如淘宝网的商家,商家自身也有一套组织架构,比如采购部,销售部,客服部,后勤部等,有些人拥有客服权限,有些人拥有上架权限等等,所以用户组是可以拓展的
普通用户组: 即没有上下级关系,和组织架构,职位都没有关系,也就是说可以跨部门,跨职位,举个例子,某电商后台管理系统,有拼团活动管理角色,我们可以设置一个拼团用户组,该组可以包括研发部的后台开发人员,运营部的运营人员,采购部的人员等等。
每个公司都会涉及到到组织和职位,下面就重点介绍这两个。
1.5.1 组织
常见的组织架构如下图:
我们可以把组织与角色进行关联,用户加入组织后,就会自动获得该组织的全部角色,无须管理员手动授予,大大减少工作量,同时用户在调岗时,只需调整组织,角色即可批量调整。
组织的另外一个作用是控制数据权限,把角色关联到组织,那么该角色只能看到该组织下的数据权限。
1.5.2 职位
假设财务部的职位如下图:
每个组织部门下都会有多个职位,比如财务部有总监,会计,出纳等职位,虽然都在同一部门,但是每个职位的权限是不同的,职位高的拥有更多的权限。
总监拥有所有权限,会计和出纳拥有部分权限。
特殊情况下,一个人可能身兼多职。
1.6 含有组织/职位/用户组的模型
根据以上场景,新的权限模型就可以设计出来了,如下图:
根据系统的复杂度不同,其中的多对多关系和一对一关系可能会有变化
在单系统且用户类型单一的情况下,用户和组织是一对一关系,组织和职位是一对多关系,用户和职位是一对一关系,组织和角色是一对一关系,职位和角色是一对一关系,用户和用户组是多对对关系,用户组和角色是一对一关系,当然这些关系也可以根据具体业务进行调整。
模型设计并不是死的,如果小系统不需要用户组,这块是可以去掉的。
分布式系统且用户类型单一的情况下,到这里权限系统就会变得很复杂,这里就要引入了一个"系统"概念,此时系统架构是个分布式系统,权限系统独立出来,负责所有的系统的权限控制,其他业务系统比如商品中心,订单中心,用户中心,每个系统都有自己的角色和权限,那么权限系统就可以配置其他系统的角色和权限。
#p#分页标题#e#分布式系统且用户类型多个的情况下,比如淘宝网,它的用户类型包括内部用户,商家,普通用户,内部用户登录多个后台管理系统,商家登录商家中心,这些做权限控制,如果你作为架构师,该如何来设计呢?大神可以在评论区留言交流哦!
2.授权流程
授权即给用户授予角色,按流程可分为手动授权和审批授权。
权限中心可同时配置这两种,可提高授权的灵活性。
手动授权: 管理员登录权限中心为用户授权,根据在哪个页面授权分为两种方式:给用户添加角色,给角色添加用户。
给用户添加角色就是在用户管理页面,点击某个用户去授予角色,可以一次为用户添加多个角色;给角色添加用户就是在角色管理页面,点击某个角色,选择多个用户,实现了给批量用户授予角色的目的。
审批授权: 即用户申请某个职位角色,那么用户通过OA流程申请该角色,然后由上级审批,该用户即可拥有该角色,不需要系统管理员手动授予。
3.表结构
有了上述的权限模型,设计表结构就不难了,下面是多系统下的表结构,简单设计下,主要提供思路:
4.权限框架
Apache Shrio
Spring Security
在项目中可以采用其中一种框架,它们的优缺点以及如何使用会在后面的文章中详细介绍.
5.结语
权限系统可以说是整个系统中最基础,同时也可以很复杂的,在实际项目中,会遇到多个系统,多个用户类型,多个使用场景,这就需要具体问题具体分析,但最核心的RBAC模型是不变的,我们可以在其基础上进行扩展来满足需求。
伯禽治国颇有才能,为什么还是有人预测要被齐国超越?
临走之前嘱咐儿子说,我的身份已经跟高贵了,在这个天底下能比我强的人也许只有君主了,但是我从来也不骄傲,如果有人来拜访我,我可以先暂停洗头,甚至可以先不吃饭。
这样子来对待别人,我都很担心会有贤人对我不满意,你出去之后千万不能因为这块封地是自己的,就用傲慢的态度对待别人啊。
这段话后来还被借用,写在了诗里面。
小编反复思考了这一段话,觉得说的十分中肯,周公确实有值得自豪的身份,但是他依旧勤勤恳恳,他的儿子也没有因为有了土地,就只顾着自己享受。
到了鲁国之后,开始了他的工作,谦虚的听取有用的建议,并且适中告诉自己应当用什么样的态度来治理国家。
把鲁国向着一个好的方向推动,并且在有危难的时候,他还担任了一回军事指挥,指挥着联军打败了敌人,维护了鲁国的安定。
他已经十分勤奋的想把这个国家整治好,这在后代看来已经是很不容易的事情了,因为有太多的人坐上这个位置之后,就只想着自己的享乐,不想管理事务。
但是却还是有人说,鲁国在往后的日子里一定会被压制,后来的事情也确实这样发生了,齐国在大部分的时间里面,确实比鲁国强大,并且最后楚王灭掉了鲁国,齐国还是作为七个大国存在着。
他是哪里没有做好,会对后世产生这样的影响呢? 因为说这句话的人看到了这样的事情发生,伯禽在三年之后,才回到天子那里回报自己治理国家的情况。
本来这个事情应该在一年以内就完成的,但是他却拖到了第三年,天子问他为什么这么缓慢才过来,他说治理国家不应该急躁,而是要依据当地的风俗习惯,一点一点的变革。
他还给自己找了一个十分可靠的理由,他认为守丧都需要三年,他想要做彻底的改变,当然也就需要这么多的时间。
这样看起来并没有什么问题,他说的也确实很有道理。
但是同时期发生的另一件事情,突出的表现了伯禽在治国上面的失误。
跟他相差的时间不久,吕尚被封到了齐国,仅仅五个月之后,他就回来汇报成绩了,天子问他你怎么这么快啊。
他说举措一定要快速,简洁明快达到最好的效果,才是治理国家的必要应当简要一些,那些没有比较的礼节完全可以省略掉,抓住最关键的东西。
听完这两个人的不同说法之后,的心里就有了考量,觉得鲁国将来一定不如齐国。
小编觉得这个想法非常具有智慧,一眼找到了最要命的地方,并且真的被他预料中了。
因为缓慢一定会伴随着复杂,一旦事情变得多了,环节变得多了就一定会降低效率。
然而政治却十分讲究效率,你的政策一定要跟当时的发展贴合,如果有战事的时候,就必须要快速的作出决定。
在后来的鲁国就受到了第一代国君的影响,体制不是很鲜明,也没有很高效。
因为权力不明晰,导致了很多问题,太过缓慢的政策实施也让地方出现了很多弊病。
就算是在鲁国最强盛的时代,都是有几家共同控制着决定权,如果有哪一方的利益受到了损害,不满意决定的话,都会影响整体,因为犯了这个错误,鲁国最后被齐国超过了。
随机文章海上屠夫鹰击-83反舰导弹,威力最强的近程反舰导弹威力强悍的硬币散弹枪,可以装填各种物体的散弹枪(铁丝/石头/硬币)揭秘希腊文物费斯托斯圆盘,4000年前老古董拥有241个神秘符号揭秘中国第一战国女尸案,古尸被扒光损毁/盗墓贼逃亡23年被抓外星人养殖人类吃灵魂,传人类是外星在地球培养的食物(无根据)
第一次印巴战争为什么会为第二次印巴战争埋下隐患 难道两国的问题没有解决吗
同时印度的精锐部队第一百六十一旅也迅速进人克什米尔南部地区。
巴基斯坦政府立即号召穆斯林在克什米尔展开反对印度的"圣战"。
巴基斯坦的穆斯林迅速组成民军,从北、西和西南分三路进人克什米尔。
在1947年年底之前,双方的交锋主要集中在克什米行利那加地区。
巴基斯坦民军采用人海战术,轮番向斯利金中部部斯的印军阵地发起冲击。
印军防线屡饮被穆斯林民军突破,斯利那加岌发可危。
印军指挥部急忙把最精锐的第七坦克能破,斯利玩加战线,并不断向这里增兵。
坦克部队的到来使战场局面发生改观,印军坦克在河谷横冲直撞。
遭受重创的巴基斯坦民军被迫停止了对斯利那加的进攻,后撤设防。
在冬季的战斗间歇期,印军集中了2个正规师和部分土邦军队约4万人的兵力准备先发制人,占领整个克什米尔。
巴基斯坦则在继续加强民军力量的同时,也准备把正规军投入作战,为此集中了近5万人的武装力量。
双方的作战部署和意图已不再局限于一城地的争夺了,整个克什米尔都成为了战场。
1948年3月17日印军率先进攻在资以北约20公里的唐格尔。
州克放永创巴方守军,并于次日攻占了该地。
印军继续向北进攻军事重镇拉乔里。
拉乔里位于德维河畔,扼守着从巴基斯相境内通往查谈的一条交通要道。
巴基斯坦民军曾在上一年的战斗中包围了该城,但未能攻占。
经过激烈争夺,印军解了拉乔里之围。
此后,印军又夺得了克什米尔西北部边境大片地区,前线距巴基斯坦本土不足50公里。
巴基斯坦政府立即下令正规军投人战斗。
占据人数优势的巴基斯坦武装力量开始了全线反击。
印巴两国正规军在克什米尔的第一次大规模交战 ,是围绕争夺另一个军事重镇本杰展开的。
本杰位于克什米尔西部,是克什米尔境内几条主要交通干线的必经之地。
双方在本杰城下反复拉锯,争夺异常惨烈。
在克什米尔西部的战场上,印军从1948年下半年开始集中兵力对巴坦展开进攻。
印军数次冲人城内,但都被顽强的巴基斯坦民军逐出。
后印军采取的挤压式战法,使巴军被迫放弃巴坦。
此后,印军继续扩大战果,接连攻占了巴拉穆拉和乌里。
同时,印巴在克什米尔北部的乍吉山口也展开了长达数月的争夺。
为了争取政治和外交上的主动,印、巴两国均向联合国安理会提出控告。
1948年1月20日,安理会通过决议,建立专门委员会调查和调停印巴问题。
4月21日,安理会决定由5国组成联合国印巴问题委员会,后又增加了美国。
委员会于6月15日在日内瓦召开了第一次会议。
8月中旬,委员会提出了在克什米尔停火、双方分别撤出军队和实行公民投票等分阶段解决克什米尔纠纷的建议。
虽然印巴两国最后都勉强接受了这一建议,但并未马上停止争夺。
直到同年12月下旬,已经打得精疲力竭的印、巴双方才接受了委员会经过补充的新建议。
1949年1月1日 ,印巴双方宣布在克什米尔停火,至此,历时15个月的第一次印巴战争结束。
经过7个多月的漫长谈判,印巴双方终于就停火线的确认达成协议。
这条停火线是根据当时双方实际的兵力部署划分的,印度占据了克什米尔约五分之三的地区,人口约400万;巴基斯坦占据了五分之二的地区,人口约100万。
然而,双方确认的停火线并没有解决克什米尔的归属问题,双方在停火线两边重兵对峙,不断发生武装冲突,为日后再次爆发战争留下了隐患。
随机文章特岗汀机场降落事故,每月4架飞机冲出跑道武则天的最后归宿乾陵地宫,乾陵地宫为什么不发掘(盗墓贼连连碰壁)带土召唤外道魔像,揭秘宇智波带土会什么忍术为什么中国没有龙卷风,美国是龙卷风之乡/每年会发生2000多起龙卷风揭秘海市蜃楼形成的原因,光折射形成的仙宫和神仙(以假乱真)