发明内容
鉴于上述情况,本发明提供了一种权限角色继承方法,其充分利用数据库的功能,将复杂的继承关系的处理由强大的SQL来处理,从而能够大大降低由于角色继承带来的开发方面的复杂性,并尽可能将由于处理继承而带来的性能损失降到最低。
根据本发明,权限角色继承方法包括以下步骤:步骤S202,设计角色继承的数据库表,并将关于角色继承的继承信息保存在数据库表中;步骤S204,利用数据库表,根据对角色继承的继承关系的处理来处理数据库表;以及步骤S206,根据数据库表,排除角色继承中的循环继承关系。
其中,数据库表包含了继承角色与被继承角色之间的双向链表信息,并且其至少包括以下参数:继承角色;被继承角色;继承标识,关于一次继承操作发生的唯一标识;以及是否继承线,存在直接继承关系的权限角色之间的连线。
对角色继承的继承关系的处理至少包括:增加处理、删除处理、查询处理以及修改处理。
可选地,在步骤S204中,当对角色继承的继承关系执行增加处理时,查找被继承角色的所有继承角色,查找继承于所查找到的继承角色的所有角色,并且将各角色之间的直接角色继承信息以及引发的所有间接角色继承信息,利用同一个唯一标识来批量插入数据库表。
其中,间接角色继承信息包括:继承于增加处理的继承角色的所有角色均作为继承角色,以及增加处理的继承角色由于增加处理而带来的所有新增的继承角色作为被继承角色。
可选地,在步骤S204中,当对角色继承的继承关系执行删除处理时,输入需要删除的继承关系,以找到继承角色和被继承角色,查找继承角色的所有继承关系,生成第一临时表,查找被继承角色的所有继承关系,生成第二临时表,根据第一临时表和第二临时表的继承标识,删除与继承角色和被继承角色有关的所有继承关系,根据第一临时表,调用增加处理的功能,重新生成继承角色的所有继承关系,并且根据第二临时表,调用增加处理的功能,重新生成被继承角色的所有继承关系。
可选地,在步骤S204中,当对角色继承的继承关系执行查询处理时,根据数据库表,查找继承角色的所有被继承角色。
应了解,修改处理为增加处理和删除处理的组合。
在步骤S206中,包括:加入一个关于被继承角色和继承角色的继承关系;查找被继承角色继承的第一所有角色;查找继承于继承角色的第二所有角色;将第一所有角色和第二所有角色的数据形成相同的第一和第二数据笛卡尔集合;以及将第一数据笛卡尔集合中的继承关系与第二数据笛卡尔集合中的继承关系进行比较,以确定是否存在循环继承关系。
因此,通过本发明,能够很好地解决权限的角色继承问题,与传统处理方式相比,不仅使开发的复杂性大大降低,更重要的是在性能方面基本没有额外的损失,大大提升了权限的可用性。
具体实施方式
以下将结合附图详细描述本发明的实施例。
应了解,权限的角色继承主要涉几个问题:权限使用时的角色继承查找;角色继承关系的修改或删除处理;以及角色的继承的循环继承检查等。因此,要求在充分使用角色继承带来的管理便利的同时,又能够尽量不损失性能和可用性。
图2是根据本发明的权限角色继承方法的流程图。如图2所示,该方法包括以下步骤:
步骤S202,设计角色继承的数据库表,并将关于角色继承的继承信息保存在数据库表中;
步骤S204,利用数据库表,根据对角色继承的继承关系的处理来处理数据库表;以及
步骤S206,根据数据库表,排除角色继承中的循环继承关系。
其中,数据库表包含了继承角色与被继承角色之间的双向链表信息,并且其至少包括以下参数:继承角色;被继承角色;继承标识,关于一次继承操作发生的唯一标识;以及是否继承线,存在直接继承关系的权限角色之间的连线。
对角色继承的继承关系的处理至少包括:增加处理、删除处理、查询处理以及修改处理。
可选地,在步骤S204中,当对角色继承的继承关系执行增加处理时,查找被继承角色的所有继承角色,查找继承于所查找到的继承角色的所有角色,并且将各角色之间的直接角色继承信息以及引发的所有间接角色继承信息,利用同一个唯一标识来批量插入数据库表。
其中,间接角色继承信息包括:继承于增加处理的继承角色的所有角色均作为继承角色,以及增加处理的继承角色由于增加处理而带来的所有新增的继承角色作为被继承角色。
可选地,在步骤S204中,当对角色继承的继承关系执行删除处理时,输入需要删除的继承关系,以找到继承角色和被继承角色,查找继承角色的所有继承关系,生成第一临时表,查找被继承角色的所有继承关系,生成第二临时表,根据第一临时表和第二临时表的继承标识,删除与继承角色和被继承角色有关的所有继承关系,根据第一临时表,调用增加处理的功能,重新生成继承角色的所有继承关系,并且根据第二临时表,调用增加处理的功能,重新生成被继承角色的所有继承关系。
可选地,在步骤S204中,当对角色继承的继承关系执行查询处理时,根据数据库表,查找继承角色的所有被继承角色。
应了解,修改处理为增加处理和删除处理的组合。
在步骤S206中,包括:加入一个关于被继承角色和继承角色的继承关系;查找被继承角色继承的第一所有角色;查找继承于继承角色的第二所有角色;将第一所有角色和第二所有角色的数据形成相同的第一和第二数据笛卡尔集合;以及将第一数据笛卡尔集合中的继承关系与第二数据笛卡尔集合中的继承关系进行比较,以确定是否存在循环继承关系。
可见,本发明的技术方案主要结合了数据库技术以及对授权过程的一些处理,以下将详细描述本发明的技术方案所涉及到的几个部分。
一、角色继承的数据结构设计
通过设计一个数据库的表,来保存继承信息,从而通过一个数据库表来实现双链表结构的功能。
数据库的表结构(假定表名为RoleInherit)设计如下表1所示:
表一
继承角色(rfrom) |
被继承角色(rto) |
继承标识(flag) |
是否继承线(isline) |
|
|
|
|
|
|
|
|
利用这样一个表来保存角色的继承信息。继承标识是指一次继承操作发生的唯一标识。是否继承线是指存在直接继承关系的角色之间的连线,用1和0标识“是”与“否”,上表括号中为表的字段名称。
该表结构的信息既可以看作是继承与被继承的正向关系,也可以获取从被继承角色到继承角色的方向关系。该表可以表达记录双向链表的信息。另外,为了统一处理,每次创建或删除角色,均需要在本表中增加或删除一条继承角色和被继承角色都是该角色的记录。例如,新建一个角色r1,则向该表中增加一条记录:
insert into RoleInherit(rfrom,rto,flag,isline)values(′r1′,′r1′,′10001001′,1);
二、角色继承的增加/删除/查询处理
利用表一的结构,下面讨论角色继承的增加/修改/删除/查询等处理方法。
1)增加:新增加一个角色继承关系。
增加一个继承关系时,如RoleA集成RoleB,需要处理的过程如下:
查找被继承角色的所有继承角色;
查找所有继承于继承角色的所有角色;
将本次直接角色继承信息,以及由于本次直接角色继承引发的所有间接角色继承信息,使用同一个唯一标识,一起批量插入数据库。
其中,间接角色继承的信息包括继承自本继承角色的所有角色均作为继承角色,将本继承角色由于本次继承操作带来的所有新增的继承角色作为被继承角色。
上面所有过程可以使用一条SQL语句来完成。
例如,以图1为例,已存在的继承信息包括:
r2继承r1;r3继承r1;r4继承r2;r4继承r3;r7继承r5;
因此,如果现在需要增加一个继承关系:r5继承r4,则上面所有过程可以使用一条SQL语句来完成:
insert into roleinherit(rfrom,rto,flag,isline)select t3.c1,t3.c2,@myflag,case when t3.c1=@myrfrom and t3.c2=@myrto then 1 else 0end from(select distinct(t1.rto+t2.rfrom)c0,t2.rfrom c1,t1.rto c2 from(select rto from roleinherit where rfrom=@myrfrom)as t1,(select rfromfrom roleinherit where rto=@myrto)as t2)as t3
如表二所示,上面的语句产生的作用是向数据库中增加如下数据:
表二
rfrom |
rto |
flag |
是否继承线(isline) |
r5 |
r1 |
10001016 |
0 |
rfrom |
rto |
flag |
是否继承线(isline) |
r7 |
r1 |
10001016 |
0 |
r5 |
r2 |
10001016 |
0 |
r7 |
r2 |
10001016 |
0 |
r5 |
r3 |
10001016 |
0 |
r7 |
r3 |
10001016 |
0 |
r5 |
r4 |
10001016 |
1 |
r7 |
r4 |
10001016 |
0 |
上面表二的数据表示了r5继承r4,该次操作带来的包括直接和间接的角色继承信息,因此,除了r5继承角色r1,r2,r3,r4之外,继承r5的r7也需要增加r1,r2,r3,r4的继承信息。
2)删除:删除一个选定的角色继承关系。
删除的处理相对比较复杂,因为,不仅需要删除直接继承导致的继承关系,还需要处理由于该继承线的存在,而导致的其继承的角色以及继承自它的角色带来的继承影响。
主要处理流程如下:
输入需要删除的继承关系(rfrom,rto);
查找继承rfrom的所有继承关系,生成临时表1;
查找rto继承的所有继承关系,生成临时表2;
根据临时表1和临时表2的继承标识,删除所有与(rfrom,rto)有关的继承关系;
根据临时表1,调用1)中的增加功能,重新生成继承rfrom的所有继承关系;以及
根据临时表2,调用1)中的增加功能,重新生成rto继承的所有继承关系。
根据上面的流程就可以实现角色继承关系的删除。假如,已经建立如图1所示的关系,如果需要删除r4继承r3的关系(r4,r3),那么将删除r3继承的关系(r3,r1),并且删除继承自r4的继承关系(r5,r4),(r6,r4),(r7,r4),(r7,r5),(r7,r6),以及删除(r4,r3)本身;然后再根据事先生成的临时表,按照上述的处理流程,重新构建那些r3继承的关系,以及继承自r4的所有关系。
3)查询:查找一个角色的所有继承角色。
根据上面的存储结构,查找直接或间接继承角色也变得非常简单:select distinct t1.* from(select rfrom,rto from roleinherit whererfrom=@myrfrom)t1@myrfrom=′r4′,上面的执行结果如表三所示;
表三
rfrom |
rto |
r4 |
r1 |
r4 |
r2 |
r4 |
r3 |
r4 |
r4 |
即:r4继承的角色包括r1,r2,r3,r4。
另外,由于角色继承的修改就是对继承关系的增加和删除,所以不存在独立的修改操作。
三、检查角色的循环继承
在角色继承中,不允许存在循环继承。检查循环继承的操作通常是通过编码来实现的,实现起来相对比较复杂。而使用本发明的方法则比较简单。
假如存在如图1所示的继承关系,如果加入r2继承r5,则会存在循环继承,具体检查步骤如下:
加入一个角色继承关系,例如r2继承r5;
查找r5继承的所有角色;
查找继承r2的所有角色;
将3.3和3.2的数据形成两个相同的数据笛卡儿集合(3.2中 的rfrom,3.3中的rto),集合A和集合B;
将集合A中(rfrom,rto)和基本B中的(rto,rfrom)进行比较,其中,Rto和rfrom相同的数据不算在内,如果存在相同的数据,则说明会形成循环依赖,否则就不存在循环依赖。
基于本发明的方法,@myrfrom=’r2’,@myrto=’r5’,上面的过程可以直接通过一条SQL语句来解决:select t3.c1 rfrom,t3.c2r to from(select distinct(t1.rto+t2.rfrom)c0,t2.rfrom c1,t1.rto c2 from(select rtofrom roleinherit where rfrom=@myrto)as t1,(select rfrom fromroleinherit where rto=@myrfrom)as t2)as t3,(selectdistinct(t1.rto+t2.rfrom)c0,t2.rfrom c1,t1.rto c2 from(select rto fromroleinherit where rfrom=@myrto)as t1,(select rfrom from roleinheritwhere rto=@myrfrom)as t2)as t4 where t3.c1+t3.c2=t4.c2+t4.c1 andt3.c1<>t3.c2
因此,执行的结果如表四所示:
表四
rfrom |
rto |
r2 |
r5 |
r4 |
r2 |
r4 |
r5 |
r5 |
r2 |
r5 |
r4 |
从上面可以看出,如果加入r2继承r5的话,将会存在三个循环依赖:r2←→r4;r2←→r5;r4←→r5;假如SQL的执行结果为空,则表明不存在循环依赖。
综上所述,通过本发明,能够非常方便地处理继承关系,包括非常复杂的多重继承关系。另外,很好地处理了继承的增加、删除、查询,以及复杂的循环依赖检查。由于查找一个角色的所有继承角色是一个SQL语句,所以在继承的处理上几乎没有任何性能损失。
另外,在权限查询时,每个角色包括一组权限条目,而基于本专利,可以使用查找所有角色的SQL直接关联角色的权限条目表,直接得出需要的数据权限,这样与其它常见的处理角色继承的方法相比,又能够大大提升查询权限的性能。
因此,使用根据本发明的技术方案,能够很好地解决权限的角色继承问题,与传统处理方式相比,不仅使开发的复杂性大大降低,更重要的是在性能方面基本没有额外的损失,大大提升了权限的可用性。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。