共同进退,荣辱与共(技术专栏)

技术专栏

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  11 Posts :: 0 Stories :: 68 Comments :: 2 Trackbacks

文档已补充完,特别感谢高海东提出宝贵的意见。当然,这还不是结束。我们还会陆续的完善这个模型,包括安全策略、资源归属控制、责任分离关系等等等等吧。。

 

1.     概念

访问控制技术是由美国国防部(Department of Defense, DoD)资助的研究和开发成果演变而来的。这一研究导致两种基本类型访问控制的产生:自主访问控制(Discretionary Access Control, DAC)和强制访问控制(Mandatory Access Control, MAC)。最初的研究和应用主要是为了防止机密信息被未经授权者访问,近期的应用主要是把这些策略应用到为商业领域。

 

自主访问控制,允许把访问控制权的授予和取消留给个体用户来判断。为没有访问控制权的个体用户授予和废除许可。自主访问控制机制允许用户被授权和取消访问其控制之下的任何客体(object),换句话说,用户就是他们控制下的客体的拥有者。对于这些组织,公司或代理机构是事实上的系统客体和处理他们的程序的拥有者。访问优先权受组织控制,而且也常常基于雇员功能而不是数据所有权。

 

强制访问控制,在美国国防部 Trusted Computer Security Evaluation Criteria (TCSEC) 中定义如下:一种限制访问客体的手段,它以包含在这些客体中的信息敏感性和访问这些敏感性信息的主体的正式授权信息(如清除)为基础

 

什么是基于角色访问控制(Role-Based Access Control, RBAC)?NIST 有如下定义。

访问是一种利用计算机资源去做某件事情的的能力,访问控制是一种手段,通过它这种能力在某些情况下被允许或者受限制(通常是通过物理上和基于系统的控制)。基于计算机的访问控制不仅可规定是或某个操作有权使用特定系统资源,而且也能规定被允许的访问类型。这些控制方式可在计算机系统或者外部设备中实现。

 

就基于角色访问控制而言,访问决策是基于角色的,个体用户是某个组织的一部分。用户具有指派的角色(比如医生、护士、出纳、经理)。定义角色的过程应该基于对组织运转的彻底分析,应该包括来自一个组织中更广范围用户的输入。

 

访问权按角色名分组,资源的使用受限于授权给假定关联角色的个体。例如,在一个医院系统中,医生角色可能包括进行诊断、开据处方、指示实验室化验等;而研究员的角色则被限制在收集用于研究的匿名临床信息工作上。
   
   
控制访问角色的运用可能是一种开发和加强企业特殊安全策略,进行安全管理过程流程化的有效手段。

 

2.     核心对象模型设计(RBAC0

根据RBAC模型的权限设计思想,建立权限管理系统的核心对象模型.对象模型中包含的基本元素主要有:用户(Users)、用户组(Group)、角色(Role)、控制对象(Resource Class)、访问模式(Access Mode)、操作(Operator)。主要的关系有:分配角色权限PAPermission Assignment)、分配用户角色UAUsers Assignmen描述如下:

1.        控制对象:是系统所要保护的资源(Resource Class),可以被访问的对象。资源的定义需要注意以下两个问题:

a)        资源具有层次关系和包含关系。例如,网页是资源,网页上的按钮、文本框等对象也是资源,是网页节点的子节点,如可以访问按钮,则必须能够访问页面。

b)        这里提及的资源概念是指资源的类别(Resource Class),不是某个特定资源的实例(Resource Instance)。资源的类别和资源的实例的区分,以及资源的粒度的细分,有利于确定权限管理系统和应用系统之间的管理边界,权限管理系统需要对于资源的类别进行权限管理,而应用系统需要对特定资源的实例进行权限管理。两者的区分主要是基于以下两点考虑:

                         i.              一方面,资源实例的权限常具有资源的相关性。即根据资源实例和访问资源的主体之间的关联关系,才可能进行资源的实例权限判断。 例如,在管理信息系统中,需要按照营业区域划分不同部门的客户,A区和B区都具有修改客户资料这一受控的资源,这里客户档案资料是属于资源的类别的范畴。如果规定A区只能修改A区管理的客户资料,就必须要区分出资料的归属,这里的资源是属于资源实例的范畴。客户档案(资源)本身应该有其使用者的信息(客户资料可能就含有营业区域这一属性),才能区分特定资源的实例操作,可以修改属于自己管辖的信息内容。

                       ii.              另一方面,资源的实例权限常具有相当大的业务逻辑相关性。对不同的业务逻辑,常常意味着完全不同的权限判定原则和策略。

 

2.        操作(权限):完成资源的类别和访问策略之间的绑定。

3.        用户:权限的拥有者或主体。用户和权限实现分离,通过授权管理进行绑定。

4.        用户组:一组用户的集合。在业务逻辑的判断中,可以实现基于个人身份或组的身份进行判断。系统弱化了用户组的概念,主要实现用户(个人的身份)的方式。

5.        角色:权限分配的单位与载体。角色通过继承关系支持分级的权限实现。例如,科长角色同时具有科长角色、科内不同业务人员角色。

6.        分配角色权限PA:实现操作和角色之间的关联关系映射。

7.        分配用户角色UA:实现用户和角色之间的关联关系映射。

 

 

3.     HR数据权限模型设计初稿

3.1.   访问主体

在本系统中访问主体是员工和用户组。

如图3.1.1中每个主体都有多个角色。每个角色又可能同时属于多个主体。

公司、部门、职位一定有对应的一个用户组,但用户组不一定是公司、部门、职位当中一个,也可能是虚拟出来的一个组,比如:工会组织、公司篮球队等等。

 

 

(图3.1.1

 

3.2.   分配用户角色Users Assignmen

如图3.1.1这里的Users指的是所有访问主体。用户组、员工。

用户组是可以无限制扩充的。

无论添加几个主体到最后都会映射到角色(roles)表中,成为多个角色。

然后对角色分配访问权限控制。

 

3.3.     操作

操作(权限)=访问模式+资源(resource class

如图3.3.1,比如:页面A有个查询员工信息的功能,我们在这里把他看成一个“访问客体”,被权限控制的资源(resource class)。再假设访问模式中有个“运行”模式,那么两者组合起来就是有个有效的操作(权限),然后把这个权限赋予角色,就OK了。

 

 

(图3.3.1

 

3.4.     分配角色权限(Permission Assignment

3.3节中提到,根据资源和访问模式、我们这里就有了很多操作,也就是权限。

那么我们只需要把这些权限分配到角色就可以了。如图3.4.1

 

 

(图3.4.1

3.5.     资源类别(Resources Class

 

根据以上的描述可以看出来,在本模型中主体是可以无限制扩充的。那么客体呢?我们可以看到,不管你有多少客体,到最后也都是分解成了多个资源类别(和主体一样,把每个主体都分解成了多个角色),然后和访问模式组成了操作(权限),最后赋给角色。

我们再分析下资源类别模型。

我认为我们系统的资源类别可以分为2个方向,页面功能和流程。

比如:员工资料查询,这个页面上就有查询这个客体资源类别。

而员工转正流程中又有直接主管审批这个资源。

那么我们把资源类别(resources class)设计成如图3.5.1

 

 

(图3.5.1

 

 

功能模块表中存放“流程”或“页面功能”。

“功能模块类别”用来区分,这条记录是“页面功能”还是“流程”。

一个流程有多个审批操作。我们可以放到资源类别中。

页面功能同理。

 

 

4.     小结

该对象模型最终将访问控制模型转化为访问矩阵形式。访问矩阵中的行对应于用户,列对应于操作,每个矩阵元素规定了相应的角色,对应于相应的目标被准予的访问许可、实施行为。按访问矩阵中的行看,是访问能力表CL(Access Capabilities)的内容;按访问矩阵中的列看,是访问控制表ACLAccess Control Lists)的内容。如表4.1

用户

能力

员工1

员工2

员工3

员工4

查看自己部门员工通讯录

部门员工

部门员工

部门员工

部门员工

查看自己部门员工全部资料

部门经理

 

 

 

查看自己公司员工通讯录

部门员工

部门员工

部门员工

部门员工

查看自己公司员工全部资料

 

 

档案管理员

 

(表4.1

 

4.1为整个权限模型。

 

(图4.1

 

5.     思考

5.1.   相对角色

在很多时候我们都会用到相对角色这个概念。比如:员工转正流程中就有个直接主管审批,那么这个直接主管这个角色就是一个相对角色。这个相对角色在数据库权限模型中其实也是一个角色,只用添加到角色表中给这个角色赋权限(操作)就可以了,但在开发过程中一定要注意相对角色的设定,特别是设定方法,公式。

 

5.2.   用户组的联想

用户组可以是组织架构中的实体单位。同时也可以是虚拟的,由用户自己添加、配置的一个角色的集合。角色又是权限的集合。

那么我们可以这么做,添加一个系统管理员组,然后通过角色为这个组,分配好应有的权限。以后如果有新的系统管理员,我们只需要放到这个组里面去就可以,没必要再重新配置一个用户。

这样就完全可以实现windows的权限管理了。

 

5.3.   角色的继承

给角色分配权限(操作)其实也是件比较复杂的工作。如果角色间存在一定的关系,可以直接把另外一个角色的权限直接复制过来,然后再添加自己需要的其他权限,这样不是会方便很多吗?

继承可分为两种方式,一般继承关系和受限继承关系。一般继承关系仅要求角色继承关系是一个绝对偏序关系(不能继承自己的子类),允许角色间的多继承。而受限继承关系则进一步要求角色继承关系是一个树结构(单继承)。

 

 

5.4.   资源实例(Resource Instance

场景1:有一个功能页面,查询员工资料。可访问角色有“人事专员”和“部门经理”。“人事专员”进入可以查出全公司的所有员工资料。“部门经理”进入后,只能查出自己部门的员工资料。

场景1的解决方案:

1.        在功能模块(functionmodule)表中添加“查询员工资料”这个功能。

2.        在功能资源(functionresource)表中添加这个“查询员工资料”的两个资源,“部门经理查询”和“人事专员查询”。

3.        抽象成资源类别(resourcesclass)。

4.        资源类别(resourcesclass)和访问模式(accessmode)组合成2个操作(权限)。

5.        把这两个权限分别赋予部门经理组所拥有的角色和人事专员组所拥有的角色。

6.        在开发过程中就可以根据两个不同的资源,在这个页面做查询条件的处理。

 

场景2:有一个功能页面,部门花名册。可访问角色有“部门经理”和任何登录后的员工。根据员工部门自动显示所在部门的花名册。如果是“部门经理”,就显示一些“部门经理”可以看到的敏感信息。比如,工资。

场景2的解决方案:

1.        在功能模块(functionmodule)表中添加“部门花名册”这个功能。

2.        在功能资源(functionresource)表中添加这个“部门花名册”的一个资源,“部门经理花名册”。

3.        抽象成资源类别(resourcesclass)。

4.        资源类别(resourcesclass)和访问模式(accessmode)组合成1个操作(权限)。

5.        把这个权限赋予部门经理组所拥有的角色。

6.        在开发过程中进入这个功能页面,没有这个权限的显示一般花名册。有这个权限的显示部门经理花名册。

 

小结:

资源实例让我们在按钮级权限的基础上,加上了对记录和字段的控制。当然,你也可以把场景1和场景2结合起来。记录、字段一起控制,这个肯定是可以的。

再扩展下。场景二中,如果有一天部门经理所能看到的东西改变了,加一项或少一项,怎么办呢?难道去改代码?

其实在很多情况下,都是可以做死的。比如场景二中大家都只能看到自己部门的花名册。肯定不会有一天要看公司的花名册,如果真有这个需求,那么就应该再做个功能页面。叫做“公司花名册”。

但也有些情况,是要可以调整的。同样是场景二,部门经理能看到的东西。哪天公司想变变,这个也是有可能的。

其实这个功能实现起来也非常简单。如图5.4.1

无论什么,到最后都会变成资源类别,我们直接给这个类别记录一些属性。到时候你只要根据这些属性显示就可以了,要变的时候把这些属性变了就行了。只要愿意,完全可以做个维护页面。

表资源设置(resourcesetting)记录一些访问条件。比如,这个资源按部门查询。如果需要你可以把他改成按公司查询。

表字段设置(fieldsetting)记录的是这个资源的字段信息。比如,部门经理可以看到“部门花名册”的字段。

  

(图5.4.1

 

6.     总结

本模型的主要设计思想是把所有访问主体,包括部门、职位、公司、人等等。全部分解成一个或多个角色。

把所有访问控制客体全部分解成一个和多个资源类别(Resources Class)。

把资源类别加上访问模式(读、写、删、运行等)成为一个操作,也就是权限。

然后把这个权限赋予到角色。

这个模型支持页面级权限、按钮级权限、记录级权限、字段级权限和这几种权限的任意组合。

在角色的分配上。他本身是支持一个客体有多个角色,一个角色属于多个客体。支持用户组角色、角色继承、相对角色等。特别是用户组这个设计。部门、职位、公司这些组织都可以抽象成一个用户组,直接给这个组分配权限就可以了。但用户组不仅仅只有抽象实体组织这功能,他还可以无限制的扩展。比如可以添加一个虚拟的系统管理员组。他本身就是一个员工的集合,你可以以任何形式去组合人员。

Tag标签: 权限,模型,RBAC
posted on 2008-07-24 15:42 猫咬狗 阅读(2352) 评论(17)  编辑 收藏 所属分类: Framework

Feedback

#1楼  2008-07-24 16:17 2008年的梦想      
还是沙发
  回复  引用  查看    

#2楼  2008-07-24 16:30 红尘中迷茫      
期待下一篇。
  回复  引用  查看    

#3楼  2008-07-24 22:20 留恋星空      
waiting.....
  回复  引用  查看    

#4楼  2008-07-25 08:30 高海东      
谢谢分析 写得非常好
  回复  引用  查看    

#5楼  2008-07-25 09:31 ABCD [未注册用户]
正在为这个东西头疼......
期待下篇.并谢谢博主.
  回复  引用    

#6楼  2008-07-25 10:31 昊子      
5.1. 相对角色

主管也是相對於部門,對于這種需求應該有特定的實體“部門”,可以從Group繼承其權限實體功能,并增加一個Group/User作為其Leader
  回复  引用  查看    

#7楼 [楼主] 2008-07-25 10:51 猫咬狗      

--引用--------------------------------------------------
昊子: 5.1. 相对角色

主管也是相對於部門,對于這種需求應該有特定的實體“部門”,可以從Group繼承其權限實體功能,并增加一個Group/User作為其Leader
--------------------------------------------------------

对,是这样滴。可能我没说清楚,等下修改下。我确实觉得我的文档功力不够。

其实我要表达的意思是不论你是什么样子相对出来的角色,在数据库中也是roles表中的一个角色,为这个角色赋予权限就可以了。
至于说你是怎么相对出来的,其实并不重要。
比如:部门主管,那么可以说是一个部门属性。
直接主管,那么他就是员工的属性,虽然同在一个部门,但老大不一定是一个。

千变万化,随意组合。任何存在关系的对象都可以相对出来多个角色,我们在权限模型中没必要去关心它,所以在这里说不重要。
但系统设计的时候,怎么才能设计出关系这么复杂的相对角色设定(一般用公式),也是值得我们去思考的问题。
  回复  引用  查看    

#8楼  2008-07-25 14:45 墙外行人      
不错,我仔细研究一下
  回复  引用  查看    

#9楼  2008-07-25 19:53 高海东      
这个权限中感知少个字段的控制吧,比如有些人可以看到某些字段,而有些人就不能看到这些字段.楼主考虑这个了吗
  回复  引用  查看    

#10楼 [楼主] 2008-07-28 09:14 猫咬狗      
@高海东

是的。不但某些人可以看到什么样子的字段,不能看到什么字段。

而且还有一些人可以看到多少数据,不能看到多少数据。

也就是记录级、字段级权限。

这个就是所谓的资源实例,5.4节不是还没写好吗?正在努力。。



先说说吧,我大概是这么想的。首先明确一点,不是某些人可以看到什么字段,而是某些角色可以看到什么字段。一个人毕竟可以多个角色嘛。

那么我们从需求上考虑,我有个查询员工信息页面。一般员工和部门经理进去都可以使用这个页面上的查询功能,这个模型支持,没问题。

但查询出来的结果,一般员工只能看到其他员工的通讯录等基本信息,而部门经理却可以看到很多敏感信息,比如工资。

那么最简单的做法就是,用工信息页面是个功能(功能模块表)。分出两个资源,分别是通讯录和详细资料(功能资源表)。

然后这个两个资源和访问模式组合成操作(权限),赋予2个角色。

再然后角色到人或组。不就分开了吗?

字段不是随便想怎么分就怎么分的,一定要有这个业务。说的出来道理,那么我们完全可以把这些业务分成一个一个的资源。没必要做太活,让他动态去设置。当然你一定要动态去设置也肯定是可以的,比如你再搞个表,记录“通讯录”和“详细资料”这两个资源分别应该显示什么字段,编码的时候按照这个表中记录的字段从数据库取数据就可以了。

当然,这个不一定是最好的方法。不过我现在也刚好在做我们集团的组织架构和权限的设计,大家多交流,一定可以搞出个像样的东西出来。
  回复  引用  查看    

#11楼  2008-07-28 11:05 高海东      
@猫咬狗
您好,感谢您的回复,但是我看您的模型中没有看出来有涉及到字段的表,我认为设计个比较灵活一点的,可以根据业务动态设置,字段权限的控制属于权限控制中最繁琐的控制,因为字段权限的控制往往会脱离权限控制的范畴影响界面布局。
字段权限一般是依托与模块权限的,我们需要设置“模块字段表”,与“角色模块字段表”来存储角色拥有的字段权限范围。你的模型中是否可以考虑这个呢?

  回复  引用  查看    

#12楼 [楼主] 2008-07-28 12:10 猫咬狗      
@高海东
你提的意见非常好,我已经更新了文档。5.4节已经上传了,你再看看,大家一起讨论。

其实还有些我没写全。比如,记录的归属,最常用的就是销售部门。哪些客户属于哪个销售人员,这一块。但我觉得在这个模型上做少量的修改,一定可以实现的。暂时没时间想,以后补上。。。。
  回复  引用  查看    

#13楼  2008-07-28 14:57 高海东      
我认为字段表应该和功能模块联系,可以设置信息的密级或者共享程度等,我的qq是:14983030 msn:ghd258@hotmail.com 加我联系,谢谢
  回复  引用  查看    

#14楼  2008-07-30 16:43 addday [未注册用户]
http://addday.javaeye.com/blog/221607

参考了你的设计,写的。
  回复  引用    

#15楼 [楼主] 2008-07-30 16:56 猫咬狗      
@addday
看看先,大家可以一起讨论,慢慢去完善他。
  回复  引用  查看    

#16楼  2008-07-31 08:29 addday [未注册用户]
@猫咬狗
利用树型结构的资源分类,可以组合出字段,操作等等。减少设计的复杂性。

  回复  引用    

#17楼 [楼主] 2008-07-31 16:09 猫咬狗      
@addday
你的那个父id列表是什么样的储存格式?sql2005提出了一个专门解决树形结构的方法。虽然也是老酒新壶,但最主要的是他提供了很方便的由原来的父id转到新方法的函数,我叫这个方法为全路径节点,微软叫什么我不记得了。不过确实很不错。


难后你说的那个树型结构的资源分类,其实和我做的那个差不多。
就比如我是把一个页面当成一个资源,通过读、写、删除等访问模式组合成权限赋给角色。
而你是直接把这个资源变成的权限,叫做A页面的读资源、A页面的写资源、A页面的删除资源。然后再加上了树结构,用于分类管理。
你觉得这样数据库简洁,我觉得我那样做资源管理更清晰,没有谁好谁不好,看实际项目吧。
  回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-29 10:34 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: