一种复杂对象的子对象验权方法、系统及设备的制作方法

文档序号:6470337阅读:130来源:国知局

专利名称::一种复杂对象的子对象验权方法、系统及设备的制作方法
技术领域
:本发明属于计算机领域,尤其涉及一种对象关系映射中的复杂对象的子对象验权方法、系统及设备。
背景技术
:对象关系映射(ObjectRelationalMapping,ORM)是一种将关系数据库中表的数据映射成为对象,以使开发人员把对数据库的操作转化为对对象的操作,便于开发人员以面向对象的思想来实现对数据库操作的技术。在ORM中,一般一个数据库表对应一个业务实体,一个业务实体包括多个业务对象,复杂对象与子对象则分别映射到不同的数据库表。在访问多层的复杂对象(如含有若干子对象的对象)时,由于其下属的每个子对象的权限可能不同,从而需要对访问其下属的所有子对象的用户的权限进行验证,而验权操作最终均被转换成对数据库的查询来执行返回,这样当对象关系层次较多时,对于深层子对象的验权操作将比较困难,需要软件开发人员编写大量的数据库查询代码和系统控制逻辑才能实现。目前Java平台上比较常见的开源ORM实现框架有Hibernate等,提供了对标准对象/关系(Object/Relational,O/R)映射功能的轻量级封装。Hibernate的特点是提供了数据查询和数据緩存功能,大量使用反射和运行时字节码生成。Hibernate的工作原理是通过文件(一般有两种xml文件和properties文件)把值对象和数据库表之间建立起一个映射关系。这样只需要通过操作这些值对象和Hibernate提供的一些基本类,就可以达到使用数据库的目的。例如使用Hibernate的查询,可以直接返回包含某个值对象的列表(List),而不必向传统的Java数据库连才妄(JavaDatabaseConnectivity,JDBC)访问方式一样,《1巴结果集的数据逐个装载到一个值对象中,为编码工作节约了大量的时间。然而现有的ORM框架在对复杂对象的子对象进行验权时,需要针对该对象的每个子对象分别进行查询来获取用户对该对象的子对象的权限,然后将权限查询结果返回给系统控制逻辑,同时由于需要对所有子对象进行验权,因此还需要遍历整个复杂对象集合,从而使具有两层关系对象映射的子对象验权时,访问数据库的次数达到子对象数+1次,当对三层或者更深层次的关系对象映射进行子对象验权时,要实现以上验权逻辑需要付出庞大的代码代价,且对子对象验权的复杂程度将随着对象关系层次数的增加以几何级数向上递增,从而访问数据库次数过多,导致对象关系映射中复杂对象的子对象验权效率低下。
发明内容本发明的目的在于提供一种复杂对象的子对象验权方法,旨在解决现有的对象关系映射中复杂对象的子对象验权效率低下的问题。本发明是这样实现的,一种复杂对象的子对象验权方法,所述方法包括下述步骤为复杂对象和子对象分别定义一用于标识当前用户是否有权限访问的权限标识属性;获取用户预先定义的针对复杂对象和子对象的验权条件;根据所述复杂对象和子对象的验权条件查询数据库,返回对应的权限数据列;根据所述权限数据列设置复杂对象和子对象的权限标识属性;返回带权限标识属性的对象。本发明的另一目的在于提供一种复杂对象的子对象验权系统,所述系统包括权限标识属性定义单元,用于为复杂对象和子对象分别定义一用于标识当前用户是否有权限访问的权限标识属性;验权条件获取单元,用于获取用户预先定义的针对复杂对象和子对象的验权条件;对象验权单元,用于根据所述复杂对象和子对象的验权条件查询数据库,返回对应的权限数据列;权限标识属性设置单元,用于根据所述权限数据列设置复杂对象和子对象的权限标识属性;对象返回单元,用于返回带权限标识属性的对象。本发明的另一目的在于4是供一种包括所述复杂对象的子对象-验权系统的复杂对象的子对象验权设备。在本发明实施例中,在本发明实施例中,通过为每个对象定义一用于标识当前用户是否有权限访问的权限标识属性;将用户定义的针对复杂对象和子对象的验权条件作为数据库查询参数查询数据库,返回对应的权限数据列,根据权限数据列中对应的数值设置分别复杂对象和子对象的权限标识属性,由于在对子对象进行验权时,每层子对泉只需要一次数据库查询操作,从而提高了复杂对象的子对象验权效率。图1是本发明实施例提供的复杂对象的子对象验权方法的实现流程图;图2是本发明实施例提供的复杂对象的子对象验权系统的结构框具体实施例方式为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。在本发明实施例中,通过为每个对象定义一用于标识当前用户是否有权限访问的权限标识属性;将用户定义的针对复杂对象和子对象的验权条件作为数据库查询参数查询数据库,返回对应的权限数据列,根据权限数据列中对应的数值设置分别复杂对象和子对象的权限标识属性,从而实现一种简便、高效的复杂对象的子对象验权方法。在对象关系映射中,对于复杂的应用系统来说,一个对象下面可能有若干个子对象,每个子对象下面可能还有子对象,根据对象之间的层次关系,可以形成树状的对象树结构,其中复杂对象作为对象树结构的根结点,复杂对象下的子对象作为对象树结构的子结点。当应用系统需要对复杂对象以及复杂对象下的子对象进行验权时,一般均是对由该对象以及该对象的各个层次子对象构成的对象树进行验权,即要对该对象的子对象进行验权。图1示出了本发明实施例提供的复杂对象的子对象验权方法的实现流程,详述如下在步骤S101中,为复杂对象和子对象分别定义一用于标识当前用户是否有权限访问的权限标识属性(采用bVerify表示)。其中复杂对象和子对象的权限标识属性的教:据类型为布尔类型。在步骤S102中,获取用户预先定义的针对复杂对象和子对象的验权条件。在本发明实施例中,验权条件通常是在软件运行过程中,根据应用系统的需要及具体用户角色不同而分别设置的。例如对于金额较大的某些业务数据,属于比较机密的信息,可以设置为只允许业务经理查看,而普通业务人员则只能查看金额较小的业务数据。在本发明实施例中,用户可以才艮据应用系统的需要,采用如下形式预先定义针对复杂对象和子对象的验权条件:验权条件on复杂对象,验权条件on子对象,其中on部分用于指定该验权条件针对的子对象。当然也可以采用其他形式定义针对复杂对象和子对象的验权条件,在此不再赘述。在本发明实施例中,可以将预先定义的针对复杂对象和子对象的验权条件保存在内存对象中,或者保存在应用系统的数据库中或文件系统中。当将预先定义的验权条件保存在内存对象中时,根据复杂对象和子对象之间的层次关系,生成对应的内存结构树,并将预先定义的复杂对象和子对象的验权条件分别保存在该内存结构树的对应结点中。在步骤S103中,根据针对复杂对象和子对象的验权条件查询数据库,返回对应的权限数据列。其具体过程如下A、将针对复杂对象和子对象的验权条件组装后作为^:据库查询参数。在本发明实施例中,将获取的针对复杂对象和子对象的验权条件逻辑连接,形成一个验权条件字符串,以便作为一个数据库查询参数。如当获取的验权条件包括验权条件1on对象1,验权条件2on子对象1时,则将这两个验权条件拼接后,其形式可如下所示验权条件lon对象land验权条件2on子对象l,将验权条件1on对象1and验权条件2on子对象1作为数据库查询参数。在本发明实施例中,可以采用ORM框架来实现数据库查询操作,此时,将复杂对象和子对象的验权条件逻辑连接,作为一个数据库查询参数传输至ORM框架,由ORM框架根据该数据库查询参数实现对数据库的查询操作。B、调用语法解析引擎解析数据库查询参数,得到各个层次子对象的验权条件,根据各个层次子对象的验权条件,返回对应的权限数据列。其具体过程如下将数据库查询参数中的各个验权条件转换为Case...When..的格式,然后在获取复杂对象和子对象时,利用数据库查询中可以动态生成数据列的特性,将-睑权条件用于数据列生成,并最终形成权限数据列返回。在本发明实施例中,当通过ORM框架根据数据库查询参数实现对数据库查询时,ORM框架需要调用语法解析引擎,解析传输的数据库查询参数,并根据各对象之间的层次关系,生成树状的验权条件内存结构(称为对象层次结构树),同时将数据库查询参数中的针对每个层次子对象的验权条件转换成如下数据库查询格式Case条件then1else0,此查询格式将用于后续的验权条件生成;接下来按照对象层次结构树,将验权条件转换得到的数据库查询格式保存在对象层次结构树的对应结点中。对于任一个验权条件来说,根据前文约定,在定义的时候已经指定了它将用于哪个业务对象,而根据前文所述,各个业务对象按照彼此之间的关系及层次关系,可以形成一个树状的对象树结构,对象树结构中每个结点对应一个具体的业务对象,结点本身是一个内存对象结构;此时需要才艮据层次关系在对象树结构中找到业务对象对应的结点,然后保存到相应的内存对象中;具体的保存方式没有严格要求,通常可以在各个结点对象中设置一个字符串属性用于记录此内容。根据对象层次结构树的对应结点中保存的数据库查询格式,按照普通的ORM流程进行数据库查询,在处理每层对象查询时,均根据该层对象对应的验权条件插入一段SQL语句,使用验权条件生成对应的权限数据列。其中权限数据列的值为布尔型,其内容为验权结果(真或者^f叚)。如对于由验权条件1on对象1and验权条件2on子对象1作为数据库查询参数时,ORM调用语法解析引擎,根据传输的数据库查询参数生成对象层次结构树,其根结点中保存的数据库查询格式为Case条件1then1else0asbVerify,该根结点的子结点中保存的数据库查询格式为Case条件2then1else0asbVerify。根据对象层次结构树的对应结点中保存的数据库查询格式,按照普通的ORM流程进行数据库查询,在处理对象1查询时,根据对象1对应的验权条件,插入如下SQL语句SELECTxxx,yyy,Case条件1then1else0asbVerifyFROMTtabalWHERE.....;其中Ttable为对象关系映射中对象1对应的数据库表。在处理对象1的子对象1时,根据子对象1对应的验权条件,插入如下SQL语句SELECTxxx,yyy,Case条件2then1else0asbVerifyFROMMtableWHERE.....;其中Mtable为对象关系映射中子对象1对应的数据库表。根据上述SQL语句即可返回对应的权限数据列。如上所述,在对于每一层次对象来说,只需要一次数据库查询操作,即可9得到当前用户是否对该层次对象具有访问权限,从而在两层对象关系映射中,只需要两次数据库查询才喿作,即可对两层对象关系映射中的子对象进行验权,从而提高了对象关系映射中复杂对象的验权效率。在步骤S104中,复杂对象和子对象均根据返回的权限数据列的数值设置其权限标识属性。根据返回的权限数据列,可以得到根据复杂对象和子对象的验权条件生成的复杂对象和子对象的bVerify值,将该bVerify值保存到对应的复杂对象和子对象的bVerify属性上,从而设置每个复杂对象和子对象的权限标识属性。具体来说,步骤S103中的数据库查询会返回一个数据集,其中会有一个数据列名为bVerify,该列是根据验权条件自动生成的;此时可以将该数据列的内容读取出来,按照前文所述的生成逻辑,数据列中的值只能为1或0,其中1对应真,0对应布£;接下来根据当前是在获取哪一个业务对象,将bVerify列的值设置到此业务对象中对应的布尔型属性bVerify上,这样当前业务对象的-睑权就有了结果,如bVerify为真则有权限,为假则无权限;在步骤S105中,返回带权限标识属性的复杂对象和子对象。在本发明实施例中,可以直接访问返回的带权限标识属性的复杂对象和子对象的bVerify属性,从而得到该对象是否验权通过的信息。以下以一个具体的实例对本发明实施例提供的对象验权方法的实现流程进行进一步的详细说明。假设复杂对象为采购订单对象,其包括订单号、采购员、金额合计等属性;每个采购订单可能会采购多种商品,因此,在对象关系映射中,采购订单对象与采购商品项对象之间是一对多的父子关系。假设采购商品项对象包括商品名称、单价、数量等属性。对于操作员Z,预先定义操作员Z的验权条件如下只允许查看金额合计小于4999的采购订单;只允许查看数量小于299的采购商品项;10如果有一张如下形式的采购订单订单号0001采购员张三商品名称商品名称商品名称商品名称记事本签字笔毛笔铅笔单价:单价:单价:单价:2.005.007.501.00金额合计3500数量:500数量:IOO数量:200数量:500那么经过对象关系映射,将形成一个#>对象为采购订单,其内容为订单号、采购员、金额合计等信息;该根对象为采购订单下面有四个子业务对象为釆购商品项,内容为商品名称、单价、数量等内容的对象树结构。如果操作员Z请求查看上面这张采购订单,则系统将对操作员Z进行验权,按照本发明实施例提供的对象-睑权方法,实现的具体步骤如下首先,在"采购订单"和"采购商品项"两个对象上均定义一个布尔型(真/假)的权限标识属性,名称为bVerify,用于标识当前用户是否有权限访问;其次,定义针对复杂对象和子对象的权限条件,在这里一共有两个权限条件,分别是针对"采购订单"和"采购商品项"的,具体格式没有特别限制,可以类似如下格式定义金额合计<4999on采购订单;数量<299on采购商品项;这里的on部分用于指定所属对象名,然后保存起来,可以保存在内存对象,也可以存储在数据库或文件系统中;第三,将所有的权限条件组装后作为查询参数传输到ORM框架,在这里将前述两个权限条件拼装起来,形成类似如下的内容,并作为参数传给ORM执行查询金额合计<4999on采购订单and数量<299on采购商品项第四,ORM框架调用语法解析引擎,处理各个层次的权限条件。如果同一层有多个权限条件则先合并,然后生成树状的权限条件内存结构;前述权限条件被转换成以下格式Case金额合计<4999then1else0asbVerify。此条件被保存在采购订单对象相对应的内存结构中。Case数量<299then1else0asbVerify。此条件被保存在采购商品项对象相对应的内存结构中。再按普通ORM流程,生成SQL语句进行数据库查询生成业务对象;在处理每一层对象查询时,均根据该层对象的权限条件插入到SQL语句的Select部分,即增加了一个动态生成的数据列,列名称为固定的bVerify,该列的值的类型为布尔类型,其内容为当前对象的-险权结果(真或祁I);在生成采购订单对象时,SQL语句为SELECTxxx,yyy,Case金额合计<4999then1else0asbVerifyFROM采购订单...WHERE.....在生成采购商品项子对象时,SQL语句为SELECTxxx,yyy,Case数量<299then1else0asbVerifyFROM采购商品项...WHERE..…由于获取子对象时,每一层均可以一次性查询并返回该层所有的子对象(SQL语句中不指定子对象的唯一标识);因为权限条件已经被加到SELECT部分,没有在WHERE中出现,因此可以同时查询所有对象,这样同一层只需要一次数据库查询操作,即可得到该层子对象的验权信息,从而大大提高了复杂对象的子对象验权效率。第五,每层子对象均根据对应权限数据列的数值设置权限标志属性,并根据查询返回的结果集合组装业务对象。从前文可以看出,每次查询的结果都会有根据权限条件生成的bVerify值,此数值将被保存到对应的业务对象的bVerify属性上。第六,返回已组装好的带权限标记的业务对象。调用者可以直接访问业务对象上的bVerify得到该对象是否验权通过的信息。在本例中返回结果如下:订单号0001采购员张三金额合计1500bVerify:真商品名称记事本单价2.00数量:500bVerify:假商品名称签字笔单价5.00数量,bVerify:真商品名称毛笔单价7.50数量:200bVerify:真商品名称铅笔单价1.00数量:500bVerify:假可以看到,对于采购订单对象来说是满足权限条件的,而四个子业务对象中,第一个和第四个无权限,第二个和第三个有权限;至此-验权完成,仅执4亍了两次SQL查询,即得到了全部业务对象的验权结果。应用系统可直接访问各个业务对象的bVerify属性来判断是否有权限,并根据验权结果进行显示控制或其它操作,例如将无权限的业务对象屏蔽隐藏或者显示时金额用星号代替等,从而使对象验权简便、快捷、高效。图2示出了本发明实施例提供的对象验权系统的结构,为了便于说明,仅示出了与本发明实施例相关的部分。该对象验权系统可以是内置于对象验权设备中的软件单元、硬件单元或者软硬件相结合的单元,也可以作为独立的挂件集成到对象验权系统中或者对象验权系统的应用系统中,其中权限标识属性定义单元21为复杂对象和子对象分别定义一用于标识当前用户是否有权限访问的权限标识属性。在本发明实施例中,权限标识属性采用bVerify表示,其数据类型为布尔类型。验权条件获取单元22获取用户预先定义的复杂对象和子对象的验权条件。在本发明实施例中,用户可以根据应用系统的需要,预先定义针对该应用系统中的复杂对象和子对象的验权条件,并将预先定义的验权条件保存,在内存对象中,或者保存在应用系统的数据库中或文件系统中。当将预先定义的验权条件保存在内存对象中时,所述系统还包括内存结构树生成单元23。该内存结构树生成单元23根据复杂对象和子对象之间的层次关系,生成对应的内存结构树,并将预先定义的复杂对象和子对象的验权条件分别保存在该内存结构树的对应结点中。对象验权单元24根据针对复杂对象和子对象的验权条件查询数据库,返回对应的权限数据列。该对象验权单元24包括验权条件组装模块241和数据库查询模块242。其中验权条件组装模块241将所有验权条件组装后作为数据库查询参数。在本发明实施例中,通过将验权条件组装后作为数据库查询参数传输至ORM框架中,由ORM框架根据传输的数据库查询参数实现对数据库的查询操作。数据库查询模块242调用语法解析引擎解析数据库查询参数,得到各个层次子对象的验权条件,根据各个层次子对象的验权条件,返回对应的权限数据列。在本发明实施例中,ORM框架调用语法解析引擎,解析传输的数据库查询参数,将该数据库查询参数中的各个验权条件转换成如下数据库查询格式Case条件then1else0。再按照普通的ORM流程进行数据库查询,在处理每层对象查询时,均根据该层对象对应的验权条件插入一段SQL语句,使用验权条件生成对应的权限数据列。其中权限数据列的值为布尔型,其内容为验权结果(真或者假)。权限标识属性设置单元25根据返回的权限数据列的数值设置复杂对象和子对象的权限标识属性。在本发明实施例中,根据返回的权限数据列,均可以得到根据每个层次子对象的验权条件生成的bVerify值,将该bVerify值保存到对应的对象的bVerify属性上,从而设置每层子对象的权限标识属性。对象返回单元26返回带权限标识属性的复杂对象和子对象。在本发明实施例中,可以直接访问带权限标识属性的对象上的bVerify属性,从而得到该对象是否验权通过的信息。在本发明实施例中,通过预先定义针对复杂对象和子对象的验权条件,然后借助语法解析引擎将针对复杂对象和子对象的验权条件解析成casewhen的形式存储在对象层次结构树中,然后一次性从数据库获取对象数据和权限验证结果,从而使开发人员不再需要分别为每一层对象编写验权代码,减少了业务逻辑编码量,同时由于大量减少了数据库访问次数,从而大大提高了对象验权效率。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。权利要求1、一种复杂对象的子对象验权方法,其特征在于,所述方法包括下述步骤为复杂对象和子对象分别定义一用于标识当前用户是否有权限访问的权限标识属性;获取用户预先定义的针对复杂对象和子对象的验权条件;根据所述复杂对象和子对象的验权条件查询数据库,返回对应的权限数据列;根据所述权限数据列设置复杂对象和子对象的权限标识属性;返回带权限标识属性的对象。2、如权利要求l所述的方法,其特征在于,所述方法还包括下述步骤根据所述复杂对象和子对象的层次关系,生成内存结构树;将用户定义的复杂对象和子对象的验权条件分别存储在所述内存结构树的对应结点中。3、如权利要求1或2所述的方法,其特征在于,所述步骤根据所述复杂对象和子对象的验权条件查询数据库,返回对应的权限数据列具体为将所述复杂对象和子对象的验权条件组装后作为数据库查询参数;调用语法解析引擎解析所述数据库查询参数,得到复杂对象和子对象的验权条件;根据所述复杂对象和子对象的验权条件查询数据库,返回对应的权限数据列。4、如权利要求1或2所述的方法,其特征在于,所述步骤调用语法解析引擎解析所述数据库查询参数,得到复杂对象和子对象的验权条件具体为将所述复杂对象和子对象的验权条件分别解析成Case验权条件then1else0。5、一种复杂对象的子对象验权系统,其特征在于,所述系统包括权限标识属性定义单元,用于为复杂对象和子对象分别定义一用于标识当前用户是否有权限访问的权限标识属性;验权条件获取单元,用于获取用户预先定义的针对复杂对象和子对象的验权条件;对象验权单元,用于根据所述复杂对象和子对象的验权条件查询数据库,返回对应的权限数据列;权限标识属性设置单元,用于根据所述权限数据列设置复杂对象和子对象的权限标识属性;对象返回单元,用于返回带权限标识属性的对象。6、如权利要求5所述的系统,其特征在于,所述系统还包括内存结构树生成单元,用于才艮据所述复杂对象和子对象的层次关系,生成内存结构树,并将用户定义的复杂对象和子对象的验权条件分别存储在所述内存结构树的对应结点中。7、如权利要求5或6所述的系统,其特征在于,所述对象验权单元包括验权条件组装;f莫块,用于将所述复杂对象和子对象的-验权条件组装后作为数据库查询参数;数据库查询模块,用于调用语法解析引擎解析所述数据库查询参数,得到复杂对象和子对象的验权条件,根据所述复杂对象和子对象的验权条件查询数据库,返回对应的权限数据列。8、如权利要求5或6所述的系统,其特征在于,所述数据库查询模块将所述复杂对象和子对象的验权条件分别解析成Case验权条件then1else0,并根据所述复杂对象和子对象的验权条件查询数据库,返回对应的权限数据列。9、一种包括权利要求5所述的复杂对象的子对象验权系统的复杂对象的子对象验权设备。全文摘要本发明适用于计算机领域,提供了一种复杂对象的子对象验权方法、系统及设备,所述方法包括下述步骤为复杂对象和子对象分别定义一用于标识当前用户是否有权限访问的权限标识属性;获取用户预先定义的针对复杂对象和子对象的验权条件;根据所述复杂对象和子对象的验权条件查询数据库,返回对应的权限数据列;根据所述权限数据列设置复杂对象和子对象的权限标识属性;返回带权限标识属性的对象。由于在对子对象进行验权时,每层子对象只需要一次数据库查询操作,从而提高了复杂对象的子对象验权效率。文档编号G06F17/30GK101430706SQ20081021722公开日2009年5月13日申请日期2008年11月3日优先权日2008年11月3日发明者俊张,郭志波申请人:金蝶软件(中国)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1