一种数据权限的解析方法与流程

文档序号:17161714发布日期:2019-03-20 00:49阅读:203来源:国知局
一种数据权限的解析方法与流程

本发明涉及计算机软件技术领域,特别是一种数据权限的解析方法。



背景技术:

在计算机软件设计与开发过程中,权限管理几乎成为系统设计中必不可少的一部分,每一个系统都会涉及到不同的程度的权限控制。当管理员在配置一个较为复杂的权限时,无可避免的会对所配置的权限条件进行存储,这个存储条件既需要传递给前端供管理员查看,也需要转化为控制条件用于逻辑计算,所以这个存储条件需要结构简单,逻辑清晰,易于转化,方便修改,怎样存储这个条件成为急需解决的问题。对于这个问题,现无成熟解决方案。

当下最主要的解决方案是将复杂的条件进行拆分,将每一个条件及条件之间的关系都存储在数据库中,当使用这些条件的时候,无可避免的要对这些条件以及条件之间的关系查询出来,然后根据条件之间的关系进行组装,能拿到完整的条件结构。查询的时候,需要先查询条件关系,然后根据条件关系中对条件的引用查询下一个条件或者条件关系,这样对于一个十几个条件的表达式,需要进行几十次甚至上百次的数据库操作,才能将关系查询出来,这无疑是很耗时的,并且将每个条件存储到数据库中,也比较浪费空间,所以急需一种既能减少数据库操作,并且转化不费时的方法来取代该方法。



技术实现要素:

为解决现有技术中存在的问题,本发明的目的是提供一种数据权限的解析方法,该方法解决了现有技术多次操作数据库耗时及存储量大的缺点,具有简洁、实用、高效、通用、易扩展的特点。

为实现上述目的,本发明采用的技术方案是:一种数据权限的解析方法,将权限条件语句转化为条件实体,所述的条件实体包括以下属性:条件列名,表示该条件的实体;条件符号,表示该条件的运算符号;条件值,紧跟着所述条件符号,表示该条件的运算值;and条件数组,表示与该条件是and关系的条件数组;or条件数组,表示与该条件是or关系的条件数组;其中,所述的运算符号包括等于,不等于,大于,大于等于,小于,小于等于,null,not_null,like,not_like,in,not_in;

本发明涉及到的实体类型,一种是真实的条件实体,一种是虚拟的条件实体:真实的条件实体,表示一个正常的condition表达式,比如“name>20”可以表示为一个条件列名为name,条件符号为大于,条件值为20,and条件数组为空,or条件数组为空的一个条件;虚拟的条件实体,表示一个虚拟的表达式对象,虚拟条件包括true条件实体、false条件实体,主要的作用是用于代替“()”的作用,使得既存在“&&”又存在“||”的多混合条件可以与另一个条件进行“&&”或者“||”运算。

所述的解析方法包括以下步骤:

s1、组装条件实体,将各权限条件语句的表达式中的条件符号计算出来,并根据条件列名、条件符号以及条件值组装成相应的条件实体,将各条件实体通过“()”以及逻辑运算符“&&”和“||”组装后进行表达;

s2、计算条件实体,按照先计算同级条件实体之间的“&&”运算,再计算同级条件实体之间的“||”运算,最后计算括号的方法对步骤s1中组装后的各条件实体进行计算,则每一个括号都会创建一个满足布尔表达式的true条件实体或false条件实体,最终计算出的条件实体即为解析出的数据权限。

优选地,所述步骤s1具体包括以下步骤:

s11、输入字符串格式的权限条件语句组成的表达式,按照空格分割字符串成队列str;

s12、设栈集合s为空;

s13、依次遍历str,得到队列元素s,如果s不存在,则转到步骤s18,如果s以“(”开头,则转到步骤s14,如果s属于{&&,||},则转到步骤s15,如果s以“)”结尾,则转到步骤s16,否则转到步骤s17;

s14、拆分s中的“(”及条件列名,并将每一个“(”拆分出来入栈,将条件列名入栈,转到步骤s13;

s15、弹出最近入栈的第一个元素,如果该元素为“null”或者“not_null”,则再弹出栈顶元素,并组装成一个条件实体,否则再弹出两个元素,并组装为一个条件实体,将组装的条件实体入栈,s入栈,转到步骤s13;

s16、拆分出“)”部分,判断剩下部分,如果该元素为“null”或者“not_null”,则再弹出栈顶的第一个元素,并组装成一个条件实体;否则再弹出两个元素,并组装为一个条件实体,将组装的条件实体入栈,并将剩下的“)”部分拆分为单个“)”入栈,转到步骤s13;

s17、将s入栈,转到步骤s13;

s18、返回栈s。

优选地,所述步骤s2具体包括以下步骤:

s21、输入队列a,栈为s;

s22、依次取出a中的元素a,如果a不存在,转到步骤s27,如a是“)”,转到步骤s23,否则压入s的栈顶;

s23、从s中依次弹出栈顶对象,直到找到第一个“(”,取出两者之间的所有元素记作s1,转到步骤s24;

s24、依次取出s1集合中的元素记作i,如果元素i是条件实体,则将元素i记为当前元素,转到步骤s25;

s25、判断当前元素i的后一个对象是否为“&&”,如果是,则依次扫描偶数位是否存在连续“&&”,直到数组结束或者遇到“||”,并将“||”与元素i之间的条件实体组装为数组赋值给第一个条件实体的and条件数组,并将当前元素i变为“||”符号后一个对象,重复步骤s25;如果s1集合遍历完毕,转到步骤s26;

s26、将s1集合中除第一个条件实体的部分组成or条件数组,赋值给s1中第一个条件实体记作con1的or条件数组,此时从a中去掉栈顶“(”元素,并判断a的下一个元素是否为“&&”,如果为“&&”,创建一个false条件实体con2,并将con1赋值给con2的or属性中;如果为“||”,创建true条件实体con2,并将con1赋值给con2的and属性中,并将con2入栈,转到步骤s22;

s27、返回栈的第一个元素。

本发明的有益效果是:本发明主要介绍一种基于条件实体以及将布尔表达式的条件语句解析成为条件实体的方法,通过对条件实体的设计及表达式解析过程的设计,使得数据权限控制条件语句可以直接存储在数据库中,通过解析可以轻易实现条件语句与条件实体的转化,具有简洁、实用、高效、通用、易扩展的特点。

附图说明

图1为本发明实施例的流程框图;

图2为本发明实施例拆分表达式组装为条件实体的流程框图;

图3为本发明实施例计算得到最终条件实体的流程框图。

具体实施方式

下面结合附图对本发明的实施例进行详细说明。

实施例

如图1所示,一种数据权限的解析方法,将权限条件语句转化为条件实体,所述的条件实体包括以下属性:条件列名,表示该条件的实体;条件符号,表示该条件的运算符号;条件值,紧跟着所述条件符号,表示该条件的运算值;and条件数组,表示与该条件是and关系的条件数组;or条件数组,表示与该条件是or关系的条件数组;其中,所述的运算符号包括等于,不等于,大于,大于等于,小于,小于等于,null,not_null,like,not_like,in,not_in;

所述的解析方法包括以下步骤:

s1、组装条件实体,将各权限条件语句的表达式中的条件符号计算出来,并根据条件列名、条件符号以及条件值组装成相应的条件实体,将各条件实体通过“()”以及逻辑运算符“&&”和“||”组装后进行表达;

s2、计算条件实体,按照先计算同级条件实体之间的“&&”运算,再计算同级条件实体之间的“||”运算,最后计算括号的方法对步骤s1中组装后的各条件实体进行计算,则每一个括号都会创建一个满足布尔表达式的true条件实体或false条件实体,最终计算出的条件实体即为解析出的数据权限。

本实施例具有通用性,使用一个条件控制案例来对本实施例作进一步说明,案例如下:

某学校评选五佳学生,权限条件如下:

1.大一学生要求成绩在该学院排名前五,计算机学院学生要求排名前十并且有软件作品;

2.大四学生不参与评选;

3.其他年级的学生要求学院排名前十或获得过全国级比赛奖项;

4.学生不能有记大过和留校察看的严重处分记录。

各权限条件语句组成的表达式如下:“((年级=大一&&(学院=计算机&&学院排名>=10&&软件作品not_null||学院排名>=5)||(学院排名>=10||获奖记录like全国)&&年级!=大四)&&处分记录not_in记大过;留校察看)”;表达式中相邻元素之间除括号以外有且只有一个空格,括号与相邻数值为一体。

解析过程如下:

第一步,如图2所示,将上述表达式组装为条件实体,使其只包含“()”,条件实体,“&&”,“||”的表达式:

1.首先将表达式以空格为分隔符拆分为数组a,从左到右取出,并将每一项记作a;

2.如果a以“(”开始,则拆分“(”分别入栈,如果存在多个连续的“(”,全部入栈,并将剩下部分入栈,如“((年级”,入栈后栈中有{(,(,年级};

3.如果a为“&&”或者“||”时,弹出栈顶对象s1,判断s1是否为“null”或者“not_null”,如果是,则弹出一个栈顶对象记作列名s2,则使用s1为符号,和s2组成一个条件实体压入栈顶;如果不是,弹出栈顶对象s2作为条件符号,再弹出栈顶对象s3作为条件列名,s1为条件值组成条件实体压入栈顶;并将遇到的“&&”或者“||”入栈,计算后s={(,(,a,&&},a为刚计算的条件实体;

4.如果a以“)”结尾的对象时,比如“5)”取出第一个“)”所在位置,判断“)”前的部分是否为“null”或“not_null”。如果是,如第三步一样,弹出栈顶对象,组合成条件实体。如果不是,弹出两个对象分别作为条件列名和条件符号,并组合成为条件实体。剩下的“)”入栈,如果存在多个“)”,依次入栈,计算后s={(,(,a,&&,(,b,&&,c,&&,d,||,e,)}。

5.否则a直接入栈,比如“=”,计算后s={(,(,年级,=,大一}。

最后可将上述表达式转化为((a&&(b&&c&&d||e)||(f||g)&&h)&&i),其中大写字母表示一个条件实体,条件实体的or和and属性全为null;

第二步,如图3所示,组装条件实体之间的关系,计算得到最终条件实体:

1.数组简化为

arr={(,(,a,&&,(,b,&&,c,&&,d,||,e,),||,(,f,||,g,),&&,h,),&&,i,)},设栈为s;

2.从左到右依次取出arr中的元素记作a,如果a为不为“)”,直接入栈;如果a为“)”时,依次弹出栈顶对象直到找到第一个“(”。取出两者之间的值记作s1,此时为s1={b&&c&&d||e},转到第3步;

计算b&&c&&d||e之间的关系。首先从左到右依次扫描,当遇到条件实体时,此时为对象b,判断他的下一个是否为“&&”,如果是,依次扫描偶数位,直到找到第一个不是“&&”符号的或者不存在元素扫描时,将b和“||”之间的条件实体组合成数组赋值给b的and属性,则b的and属性中有c、d。然后删除c、d。继续扫描,遇到e的时候,继续扫描其后是否有“&&”,如果有重复上边的步骤。否则进入第4步;

3.此时表达式为s1={b||e},b.and={c,d},现在将所有的条件值组成数组赋值给b的or属性,此时表达式为b,b.and={c,d},b.or={e};现判断a的后一位a2,如果a2为“||”,则弹出“(”。并创建新虚拟的true条件实体,并将b赋值给true条件实体的and数组中,并将true条件实体入栈;如果为“&&”,弹出“(”,并创建虚拟的false条件实体,并将b赋值给true条件实体的or数组中;经过计算此时栈为s={(,(,a,&&,true,},true.and={b},b.and={c,d},b.or={e},跳转到步骤2继续执行;

4.重复以上步骤,当数组arr扫描完成时,上述表达式可以转化为一个条件实体对象。

以上所述实施例仅表达了本发明的具体实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1