关于角色与权限分配的问题
问题描述
假设当前应用有两个用户admin和user,需要给admin用户配置所有的权限,比如后台管理、文章管理;需要给user用户配置文章管理的权限,有两种方案都可以实现
- 方案一
建立两个角色,一是后台管理员,具有后台管理权限,另一个是文章管理员,具有文章管理权限,给admin赋予后台管理员和文章管理员两个角色,给user赋予文章管理员角色
这种方案,各角色间没有权限重复,但用户有时需要赋予多个角色- 方案二
也是建立两个角色,一是后台管理员,既具有后台管理权限,又具有文章管理权限,另一个是文章管理员,只具有文章管理权限,给admin赋予后台管理员角色,给user赋予文章管理员角色
这种方案,每个用户只需要赋予一个角色,但角色之间会有权限的重复
对比两种方案,当有新的权限要加入时,第一种方案一般是给这些新的权限创建一个新的角色,然后把这个新角色赋予给所有需要的用户,当用户数量多时,工作量大;第二种方案则是把新的权限加入到已有的角色中去,这样对用户不需要改动,相对来说角色的数量低于用户数,应该工作量似乎要小些。
请问大家实际应用中,使用哪种方案比较好呢?
本帖已被设为精华帖!
本帖由 Summer
于 8年前 加精
高认可度评论:
需求
清单
用户 User:
用户组 Role:
权限 Permission:
方案
方案一:
用户组权限
用户角色
方案二:
用户组权限
用户角色
问题:选择方案一还是二?
我建议选择 二,因为更好理解,后面维护起来也更加合理。
加入一个现实生活中
等级
的概念进去,会比较好理解点,如:主编,小编辑。把 「后台管理员」定义为「高级管理员」,从等级上理解,是最高级,拥有所有权限,相当于
主编
。而「文章管理员」,相当于
小编辑
,有限的权限,并且权限有可能随时被主编
移除。而
admin
作为主编
,被指定为「高级管理员」用户组,并且拥有所有权限。让用户组来控制权限,权限对于用户来说是透明的,听起来更合理。
各有优点,我个人倾向于一个用户只有一个角色,这样干只是图简单。一般来说,只会在后台管理系统中使用角色权限控制,而目前公司使用后台系统的人不多,就十几个内部员工,而且角色分工很细。
还是得具体场景具体分析。不过,如果是做通用系统,从功能实现来看,我会实现单用户多角色,至于用户怎么使用就交给他们自己决定了。
需求
清单
用户 User:
用户组 Role:
权限 Permission:
方案
方案一:
用户组权限
用户角色
方案二:
用户组权限
用户角色
问题:选择方案一还是二?
我建议选择 二,因为更好理解,后面维护起来也更加合理。
加入一个现实生活中
等级
的概念进去,会比较好理解点,如:主编,小编辑。把 「后台管理员」定义为「高级管理员」,从等级上理解,是最高级,拥有所有权限,相当于
主编
。而「文章管理员」,相当于
小编辑
,有限的权限,并且权限有可能随时被主编
移除。而
admin
作为主编
,被指定为「高级管理员」用户组,并且拥有所有权限。让用户组来控制权限,权限对于用户来说是透明的,听起来更合理。
为什么一直在说合理?
假如有一天,你不在公司,你的同事把新来的主编添加到「高级管理员」用户组后,突然发现居然没有
文章管理权限
,他肯定会打电话问你:@Summer 你说的有些道理,不过有些时候等级高的用户并不需要等级低的用户的权限,那些具体工作他只分配给等级低的用户去做,比如,总编并不需要自己亲自去校对文字,这个工作交给小编辑去做就是了,总编只需要赋予某个用户小编辑这个角色就行了。如果他真的需要自己去校对文字,他给自己加个小编辑角色也可以呀。
@MrJing 说得挺中肯,比较同意你的看法
@Summer 还有,有时候等级高的用户并不熟悉具体的业务(比如一个公司的总裁),给他全部的权限,弄不好,他不小心还破坏了某个业务的操作,这个时候我们还是把具体的业务权限赋给等级低的、负责具体业务的用户为好。
@程事不足 两种方法都是可行的,只是在讨论哪种方法对于用户来说更好理解,需不需要跟用户多解释,尤其是非程序员用户。
主编明明有高级管理员权限,却无法编辑管理文章,然后你跟他说,你需要
小编辑角色
。权限和用户组的关系很容易混淆,方案一把用户组当权限来用了,想想看,是不是不需要用户组,直接拿用户挂钩权限即可?
我说一下我开发一直使用的权限逻辑。
覆盖
角色权限覆盖
角色类型权限我个人感觉一个用户多个角色比较合理!一直都是参考tp自带的用户权限
@Summer 方案一不是拿权限当用户组的,我上面例子中后台管理员具有后台管理权限,这里说的后台管理权限其实是多个权限,比如用户管理,日志管理,角色管理等等,即便我说的文章管理权限在具体设计中也是包含文章建立,文章编辑,文章删除,文章审核等多个权限的
一开始工作的时候也很纠结,现在我会选择二。
就如 @Notalone 说的,方案一就变成权限组了,Model 应该是:User, PermissionGroup, Permission ,而不是 User, Role, Permission 。
我会选择方案二
方案一是程序员思维,快速解决问题,但是不便于日后的维护。
方案二是产品思维,这样的权限划分让人更容易理解,能让一般人扫一眼就能了解每个用户的权限范围。
楼主可以看一下zendframework的 Permission模块,ACL、Rbac 或许会得到一些提示。
当是在开发我的系统CITS的时候也遇到了这个问题。我是这么看的,软件是以人为本的。所以,软件的各项功能应该每个用户都有权限来操作,层级是协作思想和管理手段,不属于软件的范畴。
打个比方:
从这些来看,软件是自由的,协作则是有规矩的。那么,在设计软件的时候,就不需要再纠结权限的问题了。只需要将操作日志记录下来就行了,有跟踪有记录,他是不会轻易操作他职责范围之外的事情的。
附:我写的小感悟
@MrJing 我在开发oa的时候也是多个用户一个角色,不会一个用户多个角色,特别是继承关系,用户用的时候会特别不好理解,最后权限错乱得不偿失。
做权限依赖 这些问题就解决了,控制粒度可以自由收放
@Jinrenjie 您好 ,权限依赖是什么概念,能说下吗?
第二种吧 结构清晰 管理方便
初来乍到 我觉得两个方案可以合并一下 一个人可以拥有多个角色 一个角色可以拥有多个权限 每个角色之间的权限也可以重复 这样的话是不是两者就可以兼得