本文在第一篇“四维权限管理模型”的基础上,将起思路和解决方法运用到产品模块设计上。根据普通业务系统中与权限相关的两用例:权限管理和访问控制(即:访问验证),进行了概要设计(已作删减)。 
1.引言 
1.1编写目的 
略 
1.2项目背景 
略 
1.3术语与约定 
安全对象 
访问受控制的对象,如:“报表”、“项目”等。系统中主要的“业务对象”都是典型的安全对象。 
访问场景 
一个访问场景将提供诸如“操作者”、“被操作对象”、“操作方法”、“业务状态”、“有效期限”等元素,供访问验证判断所用。根据分析(详见参考文档中的说明),每个访问场景至少包括三个必须的元素: 
“操作者”,用户、角色、用户组、单位等; 
“被操作对象”,具体的业务对象,如“报表”; 
“操作方法”,对应被操作对象的基本操作和业务操作,依赖于“被操作对象”。 
访问场景中的其他元素,如“业务状态”、“对象所属”、“有效期限”等在本次设计中不是必须满足项,但兼顾设计。 
系统功能 
一个业务系统的功能项也受访问控制。在一个访问场景中,将整个业务系统视为“被操作对象”,各系统功能就成为了访问场景中的“操作方法”,便于模型的统一。 
访问控制 
或访问验证,系统中发生访问场景时,进行允许或禁止,不同于权限管理。详见2.任务概述。 
权限管理 
或访问控制管理,对访问规则进行维护管理,不同于访问控制。详见2.任务概述。 
  
1.4参考资料 
内部 
《四维权限管理模型》 
外部 
略 
  
2.任务概述 
与权限相关联的有“访问验证”和“访问控制管理”两项主要任务: 
访问验证 
根据事先定义的访问许可规则对系统中的各种访问操作(含对系统功能的访问、对业务对象的访问)的合法性进行验证。是访问许可规则作用的动态实现。 
访问控制管理 
主要是管理维护系统允许中各种访问操作时各种因素(访问者、访问系统功能、访问业务对象、访问业务规则等)之间的关系。是对访问许可规则静态管理维护的实现。 
涉及用例 
“访问验证”和“访问控制管理”在系统中是两个用例。其中“访问控制管理”以权限管理模块来实现(与系统具体业务关联紧密,本次迭代不涉及),“访问验证”以访问控制模块来实现。除开数据的依赖,在业务上两者相互独立。 
 
   
  
3.用例分析 
  
用例名称:访问控制 
  
  
 
描述:根据业务需求和安全需求,当在其他用例中发生对安全对象进行访问时,访问控制对这一行为进行允许或禁止控制。 
前置条件:其他用例对安全对象的访问被激活。 
后置条件:无 
基本事件流: 
1)其他用例请求对某一安全对象进行访问,事件流开始; 
2)根据当前访问场景的各元素(操作者、被操作对象、操作方法、有效期限等)进行访问验证,得到验证结果; 
3)根据验证结果对当前访问进行允许或禁止,事件流结束。 
可选事件流:略。 
部署约束: 
在有访问控制要求的其他用例所在的物理层或逻辑层中均可以访问本用例。 
活动图:略。 
非功能需求:对单个安全对象访时,访问验证时间消耗与访问操作本身的时间消耗在同一数量级以内。 
未解决问题:无 
说明: 
  
4.对象设计 
4.1用例中的对象 
边界对象<>:无 
控制对象<>:即访问控制者对象AccessController,由该对象对访问进行控制。 
实体对象<>:即某一安全对象。 
操作流程对象<>:用于引发访问场景的流程的抽象,如某个业务操作。 
说明:访问控制者对象AccessController是唯一在本用例中可以完成设计的对象,其他对象均属于其他用例,但访问控制的实现需要这些对象在设计模式上进行配合。 
4.2用例中的行为 
访问验证:由访问控制者对象所有,由操作流程对象(即某一业务操作)激发。访问验证需存在于一个具体的访问场景中,是对原子化的操作访问的允许或禁止判断。 
权限逻辑运算:当操作流程对象引发对多对象的访问时,并因此在该访问场景中,根据访问验证出现权限干涉、权限二意性时,权限逻辑运算根据安全逻辑或业务逻辑对权限进行合并或筛选。权限逻辑运算由操作流程对象激发。 
对象访问:由其他用例直接发起,或委托操作流程对象发起。对象访问需通过访问验证和权限逻辑运算。 
4.3对象时序图 
 
   
4.4类定义 
对安全对象的访问控制在用例中适应对象访问控制者对象来完成,该对象以ObjectAccessController类实现:(采用接口化设计的分析过程详见参考文档) 
 
   
5.类实现设计 
5.1类实现 
  
 
   
安全对象访问控制者类ObjectAccessController 
 
| 
 说明  | 
    |  
| 
 主要成员  | 
 ValidateRules:java.util.ArrayList  | 
 验证规则数组,用以容纳不同的验证规则类ValidateRule,本项目仅包含ACM验证规则对象――ACMAccessValidate。 
   |  
| 
 主要方法  | 
 public static bool IsValidate(ISecurityObject,  
IOperator,       
IOperateMethod)  | 
 用于验证访问操作合法性的验证函数,该函数调用类的验证规则数组中所有的验证规则类逐一验证,最后汇总作出判断  |   
  
验证规则抽象类ValidateRule 
 
| 
 说明  | 
 用于使所有的验证规则对象具有相同的调用格式  |  
| 
 主要成员  | 
    | 
    |  
| 
 主要方法  | 
 public bool Validate( ISecurityObject 
IOperator,       
IOperateMethod)  | 
 用于验证访问操作合法性的验证函数 
   |   
  
ACM验证规则类ACMValidateRule 
 
| 
 说明  | 
 用于实现按照ACM进行访问验证  |  
| 
 主要成员  | 
    | 
    |  
| 
 主要方法  | 
 public override bool Validate( ISecurityObject 
IOperator,       
IOperateMethod)  | 
 用于验证访问操作合法性的验证函数 
   |   
  
备注:用于支持访问控制用例,访问场景中的元素在均被定义为标准接口的实现。 
安全对象:ISecurityObject 
操作者:IOperator 
操作方法:IOperateMethod 
其他用例在实现类设计时,需从这里继承。 
  
5.2数据实现 
本次迭代中,仅ACM验证规则类ACMValidateRule需要实现。ACM作用原理详见参考文档中的分析。 
“访问控制矩阵(规则)表” 
 
| 
 字段说明  | 
 字段名  | 
 数据类型  | 
 是否允许为空  | 
 数据完整性  |  
| 
 流水号  | 
 id  | 
 Int  | 
 Not null  | 
 PK  |  
| 
 有效码  | 
 IntValid  | 
 Int  | 
 Not null  | 
 Default“0”  |  
| 
 安全对象类型  | 
 chrSOType  | 
 Char(20)  | 
 Not null  | 
    |  
| 
 安全对象ID  | 
 IntSOId  | 
 Int  | 
 Not null  | 
 FK  |  
| 
 操作者类型  | 
 ChrOprType  | 
 Char(20)  | 
 Not null  | 
    |  
| 
 操作者ID  | 
 IntOprId  | 
 Int  | 
 Not null  | 
 FK  |  
| 
 操作方法名称  | 
 ChrMethod  | 
 Char(20)  | 
 Not null  | 
    |  
| 
 有效期开始时间  | 
 DtmActive  | 
 Datetime  | 
 Null  | 
    |  
| 
 有效期结束时间  | 
 DtmExpired  | 
 Datetime  | 
 Null  | 
    |  
| 
 业务流程状态码  | 
 IntProcessState  | 
 Int  | 
 Null  | 
    |  
| 
 安全对象状态码  | 
 IntSOState  | 
 Int  | 
 Null  | 
    |  
| 
    |  
| 
 说明: 
根据该表记录,读取相应“有效码”,无记录(即无有效码),为访问禁止,否则为访问许可。 
“有效码”用于扩展 
“有效期开始时间”、“有效期结束时间”用于以后的有效期权限验证,可取消 
“业务流程状态码”、“安全对象状态码”用于以后的业务条件权限验证,可取消  |   
  
6.负载平衡设计 
业务系统中如有L个安全对象,每个安全对象有M个受访问控制操作方法,并有N个不同的访问者,按照非乐观估计:“访问控制矩阵(规则)表”会有L×M×N条记录。 
建议在安全对象较多时,为每个安全对象建立1对1的访问控制表,提高效率,平衡负载。 
... 
- end - 
  
   Beegee: 和我在一个产品开发中共事了半年的部门经理(其实是产品经理)告诉我可以离开项目组了。半年前,他委托我设计他的产品中的权限管理模块。于是,我用我贫瘠的大脑给他想了些方案。难得他还那么看得上,支持我实现了我的设计,当然也加了不少我不喜欢的东西。现在,却因为一些原因我要离开这个产品组了,这位经理也不准备对这个模块再作更多的投入了,于是我想我可以把我的这些的想法拿到我的Blog中了,算是自我消遣吧。^_^,也希望能够帮助其他程序员完善他们自己的设计,全当反面教材啦!    共两篇:    1.“ACM四维权限管理模型”    2.“权限管理与访问控制概要设计”(本文) 
  
   
 
  |