通用权限系统-2023V1
创始人
2024-05-30 05:43:41
0

说明

本文主要对功能授权设计做详细说明,对于数据授权可以参考设计思路;

需求

原始需求

背景

  • 假定一个系统,有自身的组织机构-部门,用户有各自的角色;

  • 系统中存在多个应用套餐,一个应用套餐包含许多应用,一个应用包含很多模块,一个模块对应多个功能;

  • 一个功能可能对应客户端的一个按钮或者功能,服务端的几个接口

需求

  • 可以授权用户访问某个应用套餐、应用、模块、功能的权限
    • 若将应用权限授予用户,则此用户拥有此应用下的所有模块、功能的权限,通用具有此应用后续加入的功能的权限,无须重新授权, 以此类推
    • 若授予用户具有的应用、模块权限存在重合的情况,则取拥有权限的并集
  • 可以像授予用户权限一样授予组织机构、角色访问某应用、功能这些权限
    • 若授予某个部门则部门下的所有用户均具有此权限,后续加入的部门的用户无须重新授权;但有时希望是此部门下的直属用户才具有这些权限,有时希望此部门的递归下级部门的用户全都具有这些权限;
    • 若授予角色,则通用如此
  • 给某组织机构的管理员角色授予某些应用的权限,他们可以将这些权限中的一部分再次授予其当前组织机构下的某些用户

分析

  • 应用、套餐这些都是对最小的可授权单位的一种归类,归类具有层级关系,可以统一抽象
  • 操作最终是由用户来完成的,组织机构、角色、部门这些是对用户的一种归类,这些归类具有层级关系,可以统一抽象
  • 授权行为就是将 可授权的单位 与 用户的归类关联起来,筛选时考虑关联是可以多对多的,选择需要足够的灵活,最后有一套自由组合的规则
  • 授予权限的级联控制,即授予给用户A权限后,用户A是否可以将这些权限再授予B的控制

设计

  • 资源 (resource):不论是功能还是其归类,还是具体的数据值亦或是其它,这些被授予的元素,统一抽象称为资源,其最小单位为 操作
    • 对于资源的选择与组合,抽象为统一规则
  • 主体 (subject):不论是用户还是其归类,还是具体的某个可以授予资源的元素,统一抽象称为主体,其最小单位为 用户
    • 对于主体的选择与组合,抽象为统一规则
  • 授权行为:授权行为实际上就是对于资源与主体的关联关系,这些关联数据也可以称为授权记录,同时可以带上授予权限时的一些规则,例如级联授权的控制

总体结构:

n:mtree结构n:mn:mn:mn:mn:mn:mtree结构n:muserGroupusersubjectsubjectResourceRefsresourceoperateGroupoperate

对于subject的结构:

subjectorg:1org:2role:1role:2identity:1user:1...dept:1-1dept:1-2org:1-1org:1-2user:auser:duser:bdept:1-1-1dept:1-1-2user:crole:org:1role:org:2role:2-1role:2-2user:e

说明:

  • 除user 外,其余的(org、dept这些)均为 userGroup的的一种,可通过类型标识来区分
  • user 可以属于多个,属于任意的 userGroup
  • userGroup 具有层级关系,每项都可以具有自身的类型,但是会受到所有父级层级的限定
    • eg: userGroupA的类型为 org,但是其父类型为 role,则其真实类型应该是 role-org 的有序联合类型;

对于resource的结构:

resourceappGroup:1appGroup:2operate:1app:3module:4module:5...app:1app:2module:1module:2module:3operate:2operate:3

说明:

  • 除 operate 外,其余的(app、module这些)均为 operateGroup 的一种,可通过类型标识来区分

  • 与subject的规则类似,只是在业务上的类型所代表的意义不同;

详细设计

User:

id:Integer
userGroups:List

UserGroup:

id:Integer
name:String
pid:Integer
level:Integer
path:String = "/1/23/44"
type:String = "org"
managerId:Integer
users:List
  • pid:父节点的id,如果没有父节点,可以使用 0 标识。
  • type: org/dept/role/identity/default , 可以自定义各种类型(机构、部门、角色、身份等)
  • managerId: 管理员id,即某个用户ID,可预设规则:当授权给某个用户组时,管理员默认具有此组下的所有权限

Subject:

id:Integer
type:String
value:Integer
order:Integer
selectorRule:String
combinationRule: String
cascadeLevel:Integer

说明:

  • type: 可以是 user 、userGroup ,此时 value 值为当前type 对应的值,eg: type 是 user,则value 是 user的id。

  • selectorRule = 筛选规则

    • 通过此规则可以方便筛选出目标范围,例如 筛选所有id大于3的,userGroup.type=org 的用户组
    • 预置规则: neq=不等 ;eq =等于; gt=大于; gl=小于;支持同时多个规则
  • combinationRule = 不通 subject 的 ( selectorRule 筛选后的)数据组合方式

    • 预置规则: and 交集; or 并集;
  • order: 升序(确定不同subject.combinationRule 计算的优先级),最后得到的就是最终的用户集合;

  • cascadeLevel = 级联层级,标识筛选时向当前节点的上级或者下级挑选的层数;

    • 0 = 当前级别,当前节点;
    • 大于0 标识当前类型到其的下级的层级数,可以定义 9999 表示不限制向下层级值
    • 小于0 为当前层级向上的层级数,可以 -9999 表示不限制向上层级值
    • 可以定义 10000 为不限制向上或者向下层级值

对于特殊需求,筛选规则建议根据实际业务情况做扩展甚至改写,只需要有些字段记录下规则配合代码的保存与解析形成一个完整的筛选功能即可,可以按层存储,按照id关联主要是为方便做索引查询;

删选规则运行逻辑:

假设有一个规则是筛此用户必须是机构 3 的用户或者下级机构的用户; 用户身份id是1或者2,且用户角色部不等于3的用户;

我的得到的表达式如下: org in (3的下级,3的下下级)and role != 3 and ( identity in (1,2) )

Subject
type: identity
order: 1
value: 1
selectorRule: eq
combinationRule: or
cascadeLevel: 1
Subject
type: role
order: 2
value: 3
selectorRule: neq
combinationRule: and
cascadeLevel: 1
Subject
type: identity
order: 1
value: 2
selectorRule: eq
combinationRule: or
cascadeLevel: 1
Subject
type: org
order: 3
value: 3
selectorRule: neq
combinationRule: and
cascadeLevel: 2

Resource:

id:Integer
type:String
value:Integer
order:Integer
selectorRule:String
combinationRule: String
cascadeLevel:Integer
  • Resource 的字段说明参考Subject

  • type: 可以是 operate、operateGroup ,此时 value 值为当前type的

SubjectResourceRef:

id:Integer
subjects:List
resources:List
cascadeAu:Booean
  • SubjectResourceRef 为授权记录,记录的是一些 resource 授予 subject的情况;

  • cascadeAu 标识是否可以级联授权,true = 被授予的subject 可以将这些拥有的 resource 授予下一个subject;false = 不能授予此次获得的 resource 给下一个subject

Operate:

id:Integer
urls:List
code:String
  • urls 一个操作可能需要服务端的接口配合,这里可以直接关联这些url
  • code:唯一标识一个操作

OperateGroup:

id:Integer
pid:Integer
level:Integer
path:String = "/1/23/44"
type:String = "app"
operates:List

说明

授权操作

  1. 选择主体,确定规则,得到一批对象 Subject

  2. 选择资源,确定规则,得到一批对象 Resource

  3. 建立授权关系 ,保存SubjectResourceRef

案例

如何给机构授予权限,则其管理员具有所有权限,机构下用户默认没有权限,需要机构管理员单独授予后方具有对应权限?

1.选择资源组k作为resource
2.设置机构a的管理员为ma
3.授权resource给subject:机构a,ma可以将这些权限授予他人
Subject
type: org
order: 1
value: a
selectorRule: eq
combinationRule: and
cascadeLevel: 0
SubjectResourceRef
cascadeAu: true
1.选择资源组k作为resource
2.选择机构a下的所有用户与部门作为subject
3.授权resource给subject:机构a,其下级拥有权限,但是无法将这些权限授予他人
Subject
type: org
order: 1
value: a
selectorRule: eq
combinationRule: and
cascadeLevel: 9999
SubjectResourceRef
cascadeAu: false

说明:管理员只是一个标识,其具体的筛选与授权规则的控制方式仍然和普通用户一样,只是默认的值(cascadeAu 与 cascadeLevel ) 不同。

扩展

  • 性能:如果筛选规则过于灵活,则其索引的难度必然加单,此时可以有两种方式来优化

    • 第一种是减少规则,减少后留下性能与灵活性折中的规则即可;通常对于大于、小于这类范围类型不推荐,因为索引难度增加,维护性降低
    • 第二种是数据固化,即不再固化规则,而是通过规则筛选出来数据后,固化到具体的id,这样查询时可以充分利用索引,但是需要考虑后续增量数据的处理
  • 筛选规则:考虑到筛选规则的复杂性,甚至可以编码提供规则、数值占位符、与对应code,用户直接使用现有规则即可,这样性能更高,只是不够灵活; 角色组的管理员 默认具有管理组的所有权限

    • 例如可以定义一个规则 selectorRule = Odd, 此规则匹配所有 user 与 userGroup ,只要 其id值为奇数则拥有 resource,特殊定义的规则需要编码解析 。
  • 对于 user 或者 operate,均可以自定义相关的属性来匹配业务做扩展

  • 数据权限,可以参考现有功能权限的方式,但是数据权限通常和具体业务相关,很多需要自行扩展。

相关内容

热门资讯

晚会主持词开场白 【必备】晚会主持词开场白(通用13篇)  主持词已成为各种演出活动和集会中不可或缺的一部分。在人们越...
六一儿童节鼓励致辞 六一儿童节鼓励致辞(通用20篇)  无论是身处学校还是步入社会,说到致辞,大家肯定都不陌生吧,致辞具...
幼儿园元旦联欢会主持词 2014年幼儿园元旦联欢会主持词2014年幼儿园元旦联欢会主持词1师:尊敬的各位老师幼:亲爱的小朋友...
同学会联欢会主持词 同学会联欢会主持词  借鉴诗词和散文诗是主持词的一种写作手法。在一步步向前发展的社会中,越来越多的活...
搞笑脱口秀台词脱口秀台词 搞笑脱口秀台词脱口秀台词1100字校园脱口秀台词每天,当我的双脚迈入合肥七中的大门,强相互作用会把我...
学生会换届大会主持词 学生会换届大会主持词  主持词的内容  主持词一般由开场白、中间部分与结束语组成。  开场白 演出或...
教研活动公开课主持稿   教研活动公开课主持稿  篇一:数学教研活动主持词  各位领导、各位老师,大家好!  在这样一个春...
《花木兰》感人台词 《花木兰》感人台词  壹 孝,替父从军父女情  感人段落:军令如山,花弧爱国心切,无奈年老气衰,百病...
红歌赛主持词 红歌赛主持词  由主持人于节目进行过程中串联节目的串联词。如今的各种演出活动和集会中,主持人往往成了...
联欢晚会主持词 联欢晚会主持词3篇  主持词可以采用和历史文化有关的表述方法去写作以提升活动的文化内涵。在如今这个时...
金榜题名主持词 金榜题名主持词(精选23篇)  主持词要根据活动对象的不同去设置不同的主持词。随着社会一步步向前发展...
光荣退休领导致辞 光荣退休领导致辞范文(通用5篇)  在学习、工作或生活中,要用到致辞的情况还是蛮多的,致辞是指在仪式...
大学迎新晚会主持词 大学迎新晚会主持词  迎新,全称迎接新春,又叫迎接新年。迎新是中国的传统节日形式。或者欢迎、迎接新来...
教师节校长简短致辞 教师节校长简短致辞(通用10篇)  在日常学习、工作抑或是生活中,大家或多或少都用到过致辞吧,在各种...
张国荣经典台词 关于张国荣经典台词  1、哭,我为了感动谁,笑,又为了碰着谁。  ——《路过蜻蜓》  2、虽然我很喜...
新郎婚礼简短致辞 新郎婚礼简短致辞(精选10篇)  在平平淡淡的学习、工作、生活中,大家都经常接触到致辞吧,致辞是指在...
美剧经典台词截图 美剧经典台词截图  在社会发展不断提速的今天,用到台词的地方越来越多,台词是一种特殊的文学语言,必须...
女朋友撒娇的经典台词 女朋友撒娇的经典台词  1、这种被朋友的情况让我很失落,因为我喜欢他。  2、“她就是躲着我我该怎么...
会主持词开场白 会主持词开场白  篇一  尊敬的各位领导、各位来宾  各位公司同仁:  大家下午好!  非常高兴和大...
中国人寿保险公司晨会主持词 中国人寿保险公司晨会主持词  主持词由主持人于节目进行过程中串联节目的串联词。以下是小编整理的中国人...