V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
abcbuzhiming
V2EX  ›  程序员

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

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


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

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

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

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

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

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

    角色就是权限点的组合而已,方便配用户的
    icylogic
        17
    icylogic  
       Oct 11, 2018 via iPhone
    用户只简单地加 tag,根据 tag 做处理。不把逻辑混在数据里,
    luozic
        18
    luozic  
       Oct 11, 2018
    RABC 权限模型; 实际的,研究一下微软的域控和 unix 的账户权限是怎么搞得,比你这个复杂的多得多了。
    rrfeng
        19
    rrfeng  
       Oct 11, 2018 via Android
    资源
    操作
    用户
    角色
    用户组
    zjsxwc
        20
    zjsxwc  
       Oct 11, 2018
    参考 Unix 一个用户可以有多个组的权限
    hsluoyz
        21
    hsluoyz  
    PRO
       Jul 13, 2019
    Casbin 实现了一套 RBAC with Domains 模型,应该可以满足复杂角色建模问题: https://casbin.org
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2603 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 71ms · UTC 11:05 · PVG 19:05 · LAX 04:05 · JFK 07:05
    ♥ Do have faith in what you're doing.