该怎么解决这样的复杂条件角色系统的建模?

2018-10-11 09:42:03 +08:00
 abcbuzhiming
很多带有用户功能的系统,都会额外的搭配一套用户组(角色),权限系统,一般来说,我们用用户组划分用户群,然后把权限赋予用户组,这样一个用户——用户组——权限的结构就搭建起来了。
这种结构能适应不太复杂的环境,比如一个企业下面有若干个部门,每个部门一个用户组就行了,但是我在实践中遇到了新的情况,在一套系统里,有的时候用户组非常简单,用的用户组却受到复杂的额外条件约束,比如,在某个学院里,学校有若干个部门,每个部门就是一个用户组,这是最简单的情况,但是额外的,学校要求我们设置某种信息员用户组,每个专业的每个年级,各有 1 名信息员;再比如他们有院级督导,每个院 1 人;还有班级督导,每个班一人。。。。
以上只是举例,我感觉像这样的系统里,用简单的用户组来建立模型无法适配用户组带有条件约束的情况,如果硬性的给用户组带上条件约束,又不够通用,如果又出现了新的条件约束,需要对用户组进行添加功能时,改动代价很大。有没有更通用的设计方案?
2777 次点击
所在节点    程序员
21 条回复
LokiSharp
2018-10-11 09:52:21 +08:00
参考 Unix 一个用户可以有多个组的权限
TomatoYuyuko
2018-10-11 10:08:06 +08:00
在前端做过类似的权限管理系统不知道是不是你说的这种
人员→角色→权限,一个人可以赋予多个角色,每种角色可以拥有多个权限,权限还可以分地区赋予,,
imn1
2018-10-11 10:23:25 +08:00
最简单的思想就是文件系统
同一个文件可以放到不同的路径,如果不想重复占用空间,就用软链、硬链、Alias ……
abcbuzhiming
2018-10-11 10:35:57 +08:00
@LokiSharp 你说的不是我的问题,我的系统里一样可以用户加入多个组,现在问题是组这一级的约束条件过于复杂


@TomatoYuyuko 关键在于角色本身受多种条件约束,而且这种条件在可预期的未来会不断增加,如何建立针对角色的通用模型非常困难
Youen
2018-10-11 11:38:11 +08:00
根据情况取舍, 比如给角色加数据权限
mcfog
2018-10-11 11:46:20 +08:00
架空角色的概念即可

权限点直接属于人,角色的概念只是一个方便批量赋权的快捷权限组合

唯一要想清楚的是角色内包含的权限发生变化的时候对人的影响,最完美的是需要在人-权限关系上追踪这个关系是继承自哪个角色的还是手动增减的,或者干脆把这个关系记录为{人,权限,来源},人+权限允许有多条记录,有任何一条有效就认为有权限
jswh
2018-10-11 11:51:58 +08:00
控制反转
把人属于某个角色从而获得某个权限,转成人拥有某个权限从而成为了某个角色。
monsterxx03
2018-10-11 11:53:29 +08:00
设置 policy, 权限只设计在 policy, policy 可以加在用户或组上, 在组内的用户自动继承组的 policy
abcbuzhiming
2018-10-11 11:55:32 +08:00
@Youen
@mcfog
@jswh
首先谢谢你们,但是你们提的解决方案,其实是把用户和角色的关系解除,但是对我提出的“描述角色组自身的约束条件复杂多变”这个问题,没有帮助,因为我需要在系统里明确的向用户展示,某个用户是什么身份(用户组),而这个用户组自身又有哪些条件约束(可能只是用于标识单一部门;但也可能更复杂属于学院+年级,或者属于专业加年级)
jswh
2018-10-11 11:56:04 +08:00
@jswh 没写完就发出去了。这样,角色和权限的关系不变,人和之和权限发生关系。新建角色的时候,只是新建了一组权限和角色映射。人和角色的关系有点鸭子模型,并不关心人的角色,只关心人的权限,只要权限到位了,既可以是角色 A 也可以是角色 B。
以前想过,后来没写。
mcfog
2018-10-11 12:22:39 +08:00
@abcbuzhiming 不用解除用户和角色的关系,人还是可以有一个或多个角色,拿来展示也好什么也好都可以啊

这样说吧,RBAC 是类似这样的 User => Role => Permission,你现在碰到的是业务复杂到继续这个模型难以描述,所以我的建议是改成 Permission <=X= User => Role,其中这个 X 的计算过程,可以读 Role 也好年纪学院也好,星座也罢,都可以
elone
2018-10-11 12:27:30 +08:00
最近刚设计了权限系统,感觉很好。可以了解一下 casbin。
menc
2018-10-11 12:52:03 +08:00
这古老的话题。。。
仔细一琢磨你这全线系统不就是论坛么。

论坛普通会员有等级,等级低只能看帖,高点能发帖,再高点还能加减金币。
还有全局的管理员若干,可以进行删帖和全站公告。
“但是额外的,学校要求我们设置某种信息员用户组,每个专业的每个年级,各有 1 名信息员” ->这就是版主,论坛每个版块都要搞一个管理员,只能在版块内删帖
“再比如他们有院级督导,每个院 1 人;还有班级督导,每个班一人”->这就是论坛父子板块的概念
论坛还更复杂呢,有站务板块,只能管理层进;还有动态板块,只允许满足某种条件的人进入(充钱了,积分>xxx )的,比这个难多了

好好看看论坛用户体系怎么做的。
bk201
2018-10-11 13:02:31 +08:00
没明白,一个用户组权限不够他,就再加一个用户组权限给他不就好了?用户组又不固定,只是个权限集合的代名词罢了.
xuanbg
2018-10-11 13:28:34 +08:00
角色不是根据条件自动形成的,是需要人自己去新建的。实际需要什么角色就建什么角色,并把相应的权限赋予该角色。然后,把用户和角色进行关联就行了。
sniffles
2018-10-11 13:33:19 +08:00
基本模型:权限点和用户。前者对应单一具体功能,后者对应人。

角色就是权限点的组合而已,方便配用户的
icylogic
2018-10-11 13:59:11 +08:00
用户只简单地加 tag,根据 tag 做处理。不把逻辑混在数据里,
luozic
2018-10-11 14:06:47 +08:00
RABC 权限模型; 实际的,研究一下微软的域控和 unix 的账户权限是怎么搞得,比你这个复杂的多得多了。
rrfeng
2018-10-11 14:11:07 +08:00
资源
操作
用户
角色
用户组
zjsxwc
2018-10-11 15:05:04 +08:00
参考 Unix 一个用户可以有多个组的权限

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/496574

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX