RBAC相关的子问题

08-07-10 gen21
    

较通用的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模型系统不需要知道组织结构了,映射给了域;

    

1
banq
2008-07-15 09:30

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

freebox
2008-07-15 11:08

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

gen21
2008-07-16 09:25

to freebox:

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

[该贴被gen21于2008-07-16 09:55修改过]

gen21
2008-07-16 09:25

to banq:

谢谢。是啊,对于权限需求不是很复杂的系统,这么做真有些得不偿失。

[该贴被gen21于2008-07-16 09:30修改过]

2Go 1 2 下一页