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

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

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


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

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

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

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

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

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

    角色就是权限点的组合而已,方便配用户的
        17
    icylogic   8 天前 via iPhone
    用户只简单地加 tag,根据 tag 做处理。不把逻辑混在数据里,
        18
    luozic   8 天前
    RABC 权限模型; 实际的,研究一下微软的域控和 unix 的账户权限是怎么搞得,比你这个复杂的多得多了。
        19
    rrfeng   8 天前 via Android
    资源
    操作
    用户
    角色
    用户组
        20
    zjsxwc   8 天前
    参考 Unix 一个用户可以有多个组的权限
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   642 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 19ms · UTC 20:39 · PVG 04:39 · LAX 13:39 · JFK 16:39
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1