权限设计的方案
时间:2010-11-17 来源:forhells
好处:易于实现,在“模块权限”和“资源权限”的控制上面,比较方便,容易。
坏处:用户类别多,用户数量大时,整个系统维护工作量大。
如果引入“角色”,如果将“用户”归到“角色”中,将“权限”分配到“角色”中,权限管理的维护工作将大大降低。同时,系统也方便实现,以下是基于“角色”的权限管理模型。
第一个版本
因为,这个“权限管理模型”不是单独一个系统使用,它是几个系统同时使用,所以在设计时,时刻需要注意,“权限”粒度的问题。以下为设计时,所需要注意的问题。
1.“用户”可以拥有多个“角色”,如果“用户”只有一个“角色”,的确是很方便实现,但是有以下的情况存在:
例如,某用户,在系统A中,分配的“权限”是可以查看和修改某类资源的“权限”,跟其他部分用户权限一样,而在系统B中,分配的“权限”是“管理员”的“权限”,但是其他部分用户的权限不是“管理员”的“权限”。
如果在“权限管理”中,分配一个“角色”,对应一个“用户”,对于以上的问题,将会有“角色”会彭胀,同时,无法“复用”已经分配好的“角色”。所以应该是,将权限分配到不同的“角色”上。“用户”同时分配几个不同的“角色”,注意,“角色”中不要有冲突。
例如:“角色A”拥有管理系统A模板A的“审核权限”,“角色A1”却只拥有查看系统A模板A的“查看权限”,将“角色A”和“角色A1”,同时分配给“用户1”,“用户1”登录系统A时,将无法判断,使用那一个角色。
2.“操作权限”,系统是由各种“模块”组成的,这里并不将模块先进行分类,然后再给予权限,这是因为每种类“模块”拥有权限控制也不一定相同,
例如,列表,在不同的模块下面,它拥有的权限也是不一样的。可能有,“删除”,“修改”,也可能只有“查看”功能。同时,编辑页面来讲,在类似论坛的这种系统上面,它可以有审核,修改,删除,置顶之类的操作,而在业务类的系统中,它无法置顶。
3.“权限”,系统中所拥有的细节“权限”,它只是用于标记,因为在分模块的团队开发中,在“权限”控制上面,各模块的开发者可能都会用自己的方言来定义各种“权限”标识,不利维护和统一维护。
4.“模块”,系统中所拥有的“模块”,包含用于“导航”并没有具体页面的模块,用于最后编辑修改的非导航的“模块”等。
5.“资源”,系统中所拥有的各种“资源”,一般是“表”,针对“表”的字段写条件表达式。
6.“系统”,子系统的集合。
这个“权限管理”解决了,维护工作量大的问题,而且在分配权限上面,相当的方便。
带来一个问题,在同一个系统中,同一个模块,同样的操作下,资源的受权不一样,如下表:
角色 |
模块 |
操作 |
资源 |
A |
A |
修改,查看 |
{A},{A,B} |
B |
A |
修改,查看 |
{A,B},{A,B} |
表 不同角色相同操作不同资源
在这种细粒度下的分配资源,按以上方式,会不方便,不灵活。可见变化点其实在于资源的分配上面。借助于历史上各位前辈的思想,再给资源和角色之间,加一个间接层,如下图所示:
第二个版本
“资源角色”体现的就是“角色”在“模块”中“操作”受限的“资源”。在设计“资源角色”注意点。
1.“资源角色”是一个变化点,在维护资源的时候,“资源”在,“资源角色”在,“资源”删除,“资源角色”也需要删除。
2.“资源角色”需要体现“模块”,“操作”,“资源”的特性。可以看到此模型比较复杂,“资源角色”好像是占了“角色”的责任。
3.“模块”应该是一种,拥有“资源”的可“操作”的对象。这里好像,“资源”跟“模块”不在一起了。
第三版本
“模块”本来就应该拥有“操作”和“资源”,在现实中,它有一个隐含条件,要么是拥有一个“操作”,意味着,拥有了可以操作,跟此“操作”相关的所有资源的权限;要么是拥有一个“操作”,只有“操作”没有“资源”。
“资源”是,“模块”中的受控资源。
“资源规则”体现的是“模块”+“操作”+“资源”形式的规则。所以它跟三块都有关系。这里和“资源”分离,是因为,它可变性很大,而“资源”可变性小。
欢迎批评。