V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abcbuzhiming
V2EX  ›  程序员

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

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


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

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

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

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

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

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

    角色就是权限点的组合而已,方便配用户的
    icylogic
        17
    icylogic  
       2018-10-11 13:59:11 +08:00 via iPhone
    用户只简单地加 tag,根据 tag 做处理。不把逻辑混在数据里,
    luozic
        18
    luozic  
       2018-10-11 14:06:47 +08:00
    RABC 权限模型; 实际的,研究一下微软的域控和 unix 的账户权限是怎么搞得,比你这个复杂的多得多了。
    rrfeng
        19
    rrfeng  
       2018-10-11 14:11:07 +08:00 via Android
    资源
    操作
    用户
    角色
    用户组
    zjsxwc
        20
    zjsxwc  
       2018-10-11 15:05:04 +08:00
    参考 Unix 一个用户可以有多个组的权限
    hsluoyz
        21
    hsluoyz  
       2019-07-13 14:28:29 +08:00
    Casbin 实现了一套 RBAC with Domains 模型,应该可以满足复杂角色建模问题: https://casbin.org
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   985 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 80ms · UTC 20:32 · PVG 04:32 · LAX 12:32 · JFK 15:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.