RBAC相关的子问题

较通用的RBAC模型系统的实现中需解决的问题:组织结构的融入,权限的定义(资源点与操作)。
想法不成熟,也许可能得不偿失,纯属想法,并未实践。
1.组织结构
角色与组织结构的关系:角色是属于某个组织的,但是并没有规定角色的权限操作资源必须属于该组织。

引入域的观念:
域是集合,指事物所属范畴,比如定义一个分公司域{分公司A,分公司B,……..}, 可以狭隘的将它理解为组织结构的某个节点的抽象,那么应用系统的域结构便是组织结构的框架。域定义好后,便可以作为事物的一个属性,属性值便是集合元素。如定义资源的域为分公司,域值 :=分公司B。

域角色:
角色(域)则被定义为一种域角色,表示的是:角色所有的权限中操作的资源必须属于该域值。同样我们可以定义权限(域)来控制操作资源的域,当然可以同时控制,不过在角色上来控制方便一些,并且权限(域)可通过分解角色来实现,所以只讨论域角色。域角色是动态的,在用户登录后获取域值才能生效。直观上角色多了一个成员属性而已。

域结构定义:
想通过配置文件来定义,一个域如这样:
<domain>
<key>subcorp</key>
<describe>分公司</describe>
<class>Corp</class>
</domain>
key:关键字,唯一标示,将随角色存入库中
describe:描述属性,域选择页面中用于显示
class:映射的类名,这个类必须是域interface Domainable
域的结构便是以此为节点的树,爱怎么定义就怎么定义。
interface Domainable
{
//实现Domainable的类须有id属性
setkeyByUser(用户);
setkeyByResource(资源);
equal(Domainable);
}
//实现Domainable的类须有id属性:域值唯一标识
setkeyByUser(用户):根据登录用户赋域值
setkeyByResource(资源):根据资源赋域值
实例化:new配置中的子类并赋域值,factory可派上用场。
Domainable的实例化相应的便有两种:用户登录获取域角色时实例化角色域,操作具体资源时权限验证要根据资源本身来实例化角色域。

验证:
定义域角色subadmin(subcorp),权限:维护该公司人事信息,user 拥有此角色。
1.user登录  
2.获取角色R1…subadmin(subcorp)
实例化Role rolex = Role(domain); Domain domain =Corp(id)
3.user 维护人事信息
4.权限验证rolex.hasPrivilege(维护人事信息,人事信息)
 首先在角色权限列表中找到了权限,然后实例化“人事信息”的subcorp域,
 Domain domainB = Corp(id); 比较:domain.equal(domainB)。

解决的问题:
一个角色替代本来权限一样,操作资源不同的许多角色;
将组织的比较从代码分离出来放在域的比较上,实际是在Domainable的3个函数上;
RBAC模型系统不需要知道组织结构了,映射给了域;

很不错,引入域概念能够增加扩展化和大型化。

从seam的应用者的角度来理解,我觉得role定义之后与用户关联,并在service的实现类上加注释语法就可以,此service表示一个外观,大致是楼主所说的域吧。

to freebox:
呵呵,目前我不了解“此service”这些概念。我表达的域是想用来描述与控制权限中的操作资源的,必如:在教务系统中,教师可以编辑其任课课程的成绩单,这个成绩单应该与教师是关联的,可以为成绩单定义一个域属性(教师),域的值为:王老师,李老师... ,这个域值便宣布谁能操作成绩单。不过在系统中,为角色定义一个域属性来代替为成绩单定义一个域属性,因为:操作资源是不定的;角色与登陆用户更容易关联。
[该贴被gen21于2008-07-16 09:55修改过]

to banq:
谢谢。是啊,对于权限需求不是很复杂的系统,这么做真有些得不偿失。
[该贴被gen21于2008-07-16 09:30修改过]

如果把“操作成绩单”和其它一些相关的领域动作集合在一个service里,这个service就表示某个子系统的所有可操作作业,如果role能够控制这个子系统,也就能控制所有相关的操作。
而楼主所说的意思是加深控制到操作的目标(成绩单),在应用这些资源的时候会很方便,但是在收集资源和更改资源控制权的时候会不会很麻烦?
比如原来这批成绩单都只有王老师能控制,但是现在需要把控制权交给李老师,成绩单直接与教师关联,似乎需要批量作业?如果把对成绩单的作业集中起来,统一加上控制,当需要交接控制权的时候仅仅改变一下role值。因为我觉得不可能期望增加一个领域资源的同时可以不重构系统。所以我认为控制到某个领域操作就可以了,不必要控制更小的粒度。