唐云
权限功能的设计一直是软件设计中复杂又不可逃避的问题,如何实现权限与系统功能设计的分离,實现松散弹性架构权限模型是研究的重点。文章首先对数据操作的权限模型进行讨论分析,然后讨论角色与数据操作的权限模型,接着以抽象数据为对象来讨论角色与对象操作的权限模型,最后讨论松散弹性可装配的角色设计和对象权限设计。
1引言
软件设计中权限模型的设计一直是软件设计师努力思考的关键问题之一。一方面,要设计一种能实现软件全部功能的权限模型;另一方面还要考虑权限模型的弹性,使其可方便地扩展,为软件在生命周期内能适应需求的适当变化。设计一种具有普遍适应性的,能提供松散耦合的完美权限模型一直是许多软件工程师追求的目标。这种模型将不依赖某一特定的平台、语言,能平滑地嵌入到各类软件研发模型中去,并提供API、控件,甚至Web Service等表现方式。对于权限的控制实现对数据层、逻辑层和表现层内在的元素都能定义,对权限等级的增加也能应付自如。
2数据操作权限的唯一表示
软件权限控制离不开数据流的分析,对于数据流的分析,无论是基于数据库,还是内存通常可以归结为添加、删除、修改和查询。假设我们令添加权值为1,删除为2,修改为4,查询为8。则数据的权限可以由4种操作的权值累加表示,且累加值权限唯一。如下表所示。
根据前面的证明,角色和数据操作权值的累加权值将是唯一的权值。
4基于权值累加的权限模型
系统中权限的分配就是通过这样的权值叠加实现,如系主任可以对本系教师的基本情况查询和修改,但对自己的基本情况只有查询的权限,那么它的权限应该为:
系主任权限=(32)部门权限+查询(1)+修改(4)+(16)个人权限+查询(1)=54
这样,算出系主任权限=54,软件设计的时候给系主任对教师数据的操作分配一个54的权值。
不光对于教师数据这样定义,对于学生数据也同样处理,对任意表都这样定义,即在数据库中设计一个表来存放用户及其对应的、定义好的权限权值。
用户登录后获得累加权值,然后通过一个函数将累加权值分解为最小颗粒的权值。当用户操作数据时将比较用户的权值是否包含对于该数据的操作权力,包含则允许操作,否则拒绝。
以上分析的是对于数据库中的表的操作,可以把数据表看成1个对象,把对数据的操作再抽象成是对象的操作权限。在数据层的对象是表,在逻辑层的权限控制对象则可以是1个类对象,在表示层则可以是1个容器或者1组控件,甚至是1个硬件设备。可以对任意要做权限控制的对象都定义权值,然后通过累加权值来实现弹性权限模型。
在数据库中这些对象的定义可以用一组权限表来存放,可以按业务分层来定义,也可以按功能结构来定义。这样的定义实现了松散、可任意重组的权限模型。
不难看出这样的权限模型对于新角色的添加和新功能的添加只需要增加权值即可实现,对于已有权限的重新定义同样也可完成。不光如此,模型现在的定义是在自然数中定义的,我们还可以在负数域中扩展,实现更复杂的多维权限设计。
5权限模型的应用形式
权限模型在系统中实现的时候可以被封装为控件或者API。对于一种应用广泛的系统权限,甚至可以设计成Web Service提供许多具有相同功能的系统,实现复用。
6结束语
软件设计中权限模型的分离,有助于软件工程师们对于软件的系统功能进行更独立的设计。在一些系统中甚至只需要考虑设计实现一个具有完全功能的系统,然后根据权限模型构建所需要的各种权限功能。加强和丰富这样一个松散弹性的权限模型框架,使其能更有效地提高软件设计效率,这是今后值得努力研究的一个方向。