计算机系统应用2010
字符串数组 时间:2021-02-22 阅读:(
)
年第19卷第10期228经验交流ExperiencesExchange一种角色权限管理方案的算法设计①刘鹏远(湖北经济学院计算机学院湖北武汉430205)摘要:基于角色的权限管理在信息管理系统的开发中得到普及应用,应用角色权限管理技术可实现不同身份登录验证后具有不同的操作界面,提高了系统的易用性和健壮性.
基于作者开发的一个项目,分权限菜单处理、修改角色数据预准备、角色展现页面逻辑、以及客户端复杂逻辑控制多个方面详尽给出一系列核心算法实现.
应用表明这些核心算法有着较好的处理性能.
关键词:角色;权限;功能点;菜单;算法AlgorithmDesignofaRole-BasedPrivilegeManagementSchemaLIUPeng-Yuan(SchoolofComputer,HubeiUniversityofEconomy,Wuhan430205,China)Abstract:Nowadays,Role-basedPrivilegeManagementhasbeengenerallyappliedintheManagementInformationSystem.
UsingMIScangivedifferentoperationinterfaceswithdifferentidentificationuserloginswhichthusmakesthesystemeasytouseandimprovesitsrobustness.
Onthebasisofoneprovincialprojecttheauthorhelds,severalkeyalgorithmsaround4partsaredesigned,whichincludeprivilege-menuprocessing,datapreparationforupdatingrole,webpagepresentationlogic,andclient-usercomplicatedlogincontrol.
Resultofpracticalusageshowsthattheyperformwell.
Keywords:role;privilege;functionpoint;menu;algorithm1引言角色权限管理给MIS系统带来更好的交互性和健壮性,丰富了业务逻辑控制细粒度,提高了应对新业务需求变更的灵活性.
但一些较常使用的如strutsmenu[1],acegi等框架具有无法重用、接口复杂、变更复杂的缺点.
本文将给出一不依赖框架的角色权限管理方案的主要算法设计实现.
图1给出了一个角色权限管理框架的数据库表设计.
2权限菜单处理许多JS组件应用于在客户端浏览器中绘制菜单,常用的有DTREE和COOLMENU[1].
不论何种JS组件,都要求必须传入一个深度优先序的菜单字符串交给JS组件,浏览器才能正确展现具有层次序的菜单.
getDFSMenuNo算法[2]将数据库表中读得的权限集合调整为深度优先序保存到vOutRight数组.
为①基金项目:湖北省教育厅重点项目(B200619001)收稿时间:2010-01-26;收到修改稿时间:2010-03-19图1角色权限管理数据库表设计[2]保证该递归算法能正常结束,需首先虚构一个根权限节点预加到权限数组vRight,然后经过多表的连接运算将某用户的权限集合结果集装载入vRight.
详尽处理流程参见文献[2].
调整权限数组为深度优先序后,vOutRight做好2010年第19卷第10期计算机系统应用ExperiencesExchange经验交流229了展现现前的数据准备,但还涉及以下算法需实现:在新建/修改/查看角色时需要按深度优先序展现出系统定义的所有权限和功能点,并将该角色具有的权限和功能点对应的checkbox框置初始状态;页面展现后,处理客户端对各checkbox的选中和去除选中动作;点击提交时,对选中checkbox的对应权限和功能点相应保存到数据库表,对没有选中的更新数据库表.
限于篇幅,本文主要对展现数据预准备和页面展现逻辑进行阐述.
3修改角色-页面展现预准备本节以修改角色为例给出算法实现流程.
用户登录系统时首先适配展现其具有权限的对应菜单,具有角色管理权限时才可能可见该菜单项点击从而进入角色管理页面.
而在角色管理页面,当具有修改角色功能点时才可见到该修改角色按钮.
假设上述条件都具备,则当点击修改角色按钮后,处理流程如下:(1)读出权限表和功能点表的所有记录分别入vRight和vRightFunc保存,读出该角色具有的功能点数组入vRealRightFunc保存.
(2)对vRight和vRightFunc继续处理,做好修改或增加角色前的数据准备,完成深度递归调整权限、给权限加上祖先权限前缀路径,以及给功能点加上祖先权限前缀路径的任务.
处理的结果分别保存在vOutRightFlag和hvOutRightFuncFlag中.
处理流程如下:1)调用第2节的getDFSMenuNo调整传入的vRight权限数组为深度优先序,并加上祖先权限前缀保存入vOutRightFlag;2)遍历访问vOutRightFlag(已调整为深度优先序并加上全祖先权限路径),对每条权限记录tempObj1做如下处理:a置初始changed=false;b取tempObj1的权限编号str1(已带祖先权限前缀)的最后一段"-"后子串,定义为tempStr1(即最后一级权限编号).
c遍历访问功能点表vRightFunc,对每条功能点记录tempObj2的menuNo字段定义为str2.
比较str2与tempStr1,若相等做如下处理:ⅰ置布尔变量changed为真(后边处理权限数组时用);ⅱ拼接str1和tempObj2的Functionno字段串得到该功能点的带祖先权限前缀的全路径,保存修改后的功能点记录为tempObj3;ⅲ若vRealRightFunc不为null(表明不是新建角色而是查看/修改已有角色,需要对该角色已具有的权限和功能点置初始选中状态从而方便后继展现).
遍历访问vRealRightFunc,在该角色实际具有的功能点记录数组中查找是否具有该功能点,将vRealRightFunc记录的功能点编号与tempObj2的功能点编号比较,若相同则说明该角色具有该功能点,继续如下处理:①置功能点记录tempObj3的状态位为选中;②不重复拼接str1串到rightInStr(记录下所有需要置选中的祖先权限路径,以";"间隔,方便后边一次性对祖先权限路径上的所有权限置初始选中用);③break退出本层循环(表示一条功能点记录对于该角色的初始状态处理完毕).
ⅳ将这样处理过后得到的tempObj3加入vTempRightFuncFlag数组保存;ⅴ重复(1)-(4)处理直至vRightFunc遍历完毕.
d若changed不变仍为false,表示该权限为非叶子权限(下一级仍为权限,是中间节点),给vTempRightFuncFlag加上一个空行对象nullRightFuncFlagObj(这类权限仅放展现页面左侧做缩进用,不在右侧功能点排列中出现),空行对象的功能点名称字段属性被定义为值"empty";e将vTempRightFuncFlag装入hvOutRightFuncFlag数组;f重复a)—d)过程处理直至vOutRightFlag遍历完毕.
3)继续处理前面已用rightInStr记录的所有需要置选中的祖先权限.
遍历vOutRightFlag,对其每条权限记录rightFlag取其menuNo定义为tempStr2(含祖先权限前缀的全路径),若rightInStr含有该串,则对应置该rightFlag状态位为初始选中.
(3)将经过上面处理完毕的vOutRightFlag和hvOutRightFuncFlag两个数组对象写入浏览器request对象的session中,转向addRole或viewRole页面展现全部的权限和功能点.
4角色展现页面第3节处理已在后台准备好了待展现的角色、权计算机系统应用2010年第19卷第10期230经验交流ExperiencesExchange限以及功能点数据,下面以JSP中最常使用的STRUTS1标签[3]为例描述展现角色的过程.
这里仍然有着复杂的scriptlet小算法用于控制权限、子权限、对应功能点的问题.
角色展现页面的逻辑处理流程如下:(1)标签内以标签对浏览器request对象session内vOutRightFlag数组进行迭代,对其每个权限记录命名为rightFlag并做如下处理:1)一个开始:a.
取session内写入的vOutRightFlag数组,以index递增整数为下标方式取得一个权限记录;b.
截取权限记录的menuNo字段串,分割为以"-"间隔的多个字符串形成字符串数组,数组的长度是权限记录全路径的长度("-"的个数),为左对齐做好准备;c.
连续b)中数组长度个空格,这样就确保了不同层次的权限记录有着不同的左缩进;d.
以开始一个checkbox的输出,其name属性值是rightFlag权限记录的menuNo字段值(权限编号);接着以标签判断该rightFlag权限对象状态是否为选中,若选中则置该checkbox的checked属性为选中;定义onclick事件相应指向remain函数处理,传入当前点击的checkbox标签.
如此完成一个权限编号的显示;e.
显示该rightFlag权限记录的menuName字段值(权限名称);f.
以">对上面的一个checkbox定义以一一对应的hidden标签,注意该hidden标签的value属性必须与rightFlag权限记录的menuNo字段串相同;而name属性必须全部相同,这里定义为"checkRightFunc".
2)结束,一个新的开始,完成功能点数组的一行排列展现:a.
以标签对浏览器request对象session内hvOutRightFuncFlag数组进行迭代,取1)a)中index整数偏移量为下标的元素命名为vRightFuncFlag(功能点数组)并做如下处理:ⅰ连续1)c)中的空格数个空格(相当于整行平移);ⅱ以标签对vRightFuncFlag功能点数组进行迭代,对其每个元素命名为rightFuncFlag功能点对象并做如下处理:b.
以标签判断rightFuncFlag功能点对象的功能点名称字段是否为值"empty",若不则说明不是空行对象,即需要输出对应的一行功能点(见3中(2)2)d)部分):以开始一个checkbox的输出,其name属性值是rightFuncFlag功能点对象的functionNo字段值(功能点编号);接着以标签判断该rightFuncFlag功能点对象状态是否为选中,若选中则置该checkbox的checked属性为选中;定义onclick事件相应指向remain函数处理,传入当前点击的checkbox标签,如此完成一个功能点编号的显示;接着显示该rightFuncFlag权限记录的functionName字段值(功能点名称);c.
重复a)直至vRightFuncFlag遍历完毕.
(3)重复(1)-(2)处理直至hvOutRightFuncFlag遍历完毕.
3)结束,完成功能点数组一行的排列显示(对应左侧的一个叶子权限);4)结束,完成一行权限和功能点的排列显示.
5)重复1)-4)直至vOutRightFlag遍历完毕.
5浏览器客户端控制逻辑上节给出了展现角色权限功能点的页面辑,此时还需定义客户端动作的算法,使用javascript语言实现.
另外,还需跟踪用户选中情况,为提交后存储该角色的权限和功能点做好准备.
为记录用户选中了哪些checkbox,一个技巧是除"全选"控制外,对每个checkbox框定义一个hidden元素——其value属性值就是checkbox框的name属性值(实际源于第3节中写入到浏览器session的对象),所有hidden元素name属性相同,这里定义为"checkRightFunc"(所有hidden元素对应的checkbox必须同name值).
对某角色具有的权限或功能点,注意其checkbox以及所有祖先的初始选中状态.
方法是对权限数组保存的权限对象和功能点数组保存的功能点2010年第19卷第10期计算机系统应用ExperiencesExchange经验交流231对象各增加字段checkFlag用于标识是否选中;在展现页面前对checkFlag赋未选中初值然后将权限对象数组和功能点对象数组保存到request;展现页面时取request,迭代取两个数组的元素并置checkbox初始状态.
对选中和去除选中的控制需编写脚本将递归与遍历结合,这样要求对checkbox的name做层次命名安排,可将name定义为带上祖先权限编号前缀(多级祖先前缀以"-"间隔)的对应权限编号或功能点编号.
角色权限功能点表只保存选中的叶子级权限及对应的功能点,而角色权限表要保存选中的权限以及它的所有祖先权限,因此对点击确定后的处理,需要区分权限和功能点.
为此对checkbox的name属性值加上约定——功能点编号checkbox的name值以"/"结尾表示是功能点.
对于如何识别选中的checkbox这里巧妙地使用了许多同name的hidden字段来跟踪对应的checkbox的选中状态,以方便后继的保存和修改处理.
(1)提交检查sendChecked该函数检查处理未选中的checkbox,将对应hidden同步标识为"",再转saveRole后台action继续处理.
1)遍历表单的所有页面元素,对当前元素eachhidden做如下处理:a.
若eachhidden的type是"hidden",那么以其value值做id或name的元素就是对应checkbox页面元素.
使用DOM的getElementById方法抓取该checkbox元素(命名为变量eachcheck);b.
若eachcheck的checked属性值为"false"(未选中),将eachhidden的value取"".
c.
继续a)-b)直至循环处理完毕当前form的所有元素.
2)重定向到保存角色页面的后台一步处理当定义好某角色的权限和功能点点击提交后,经过上述处理,浏览器request对象中name为checkRightFunc的变量得到了所有选中的权限和功能点(是一个字符串,未选中的已经被sendchecked函数去除了),后台可从request.
getparameters("checkRightFunc")获得客户端配置的角色定义,完成后继处理.
(2)全选控制selectAll该函数传入事件源checkbox变量e(即"全选"checkbox),将所有checkbox置为与其相同的状态,即"全部选中"或"全部取消".
处理方法是遍历表单的所有checkbox元素,将每个元素的checked属性赋值为e.
checked属性值.
(3)向上处理upSelect该函数传入事件源checkbox变量e(即点击的那个checkbox),不断截取事件源的前缀,从而向上处理事件源checkbox选中时的所有祖先(均选中).
如果事件源是取消选中动作,转upSelect2交给事件源的父节点处理(见图2,当取消选中时,祖先是否选中还与当前兄弟的选中状态有关).
1)取事件源name值的前缀(去掉最后一个"-"子串),只要不空,使用DOM的getElementById方法抓取该checkbox元素(即直接父亲)t;2)若事件源e是取消选中动作,传入t调用deterSelfAbove继续处理,否则转3);3)置t选中并用t代换e递归调用upSelect.
(4)根据儿子状态确定自身状态deterSelfAbove该函数传入一个checkbox元素e,用于确定e的该置选中状态与否.
显然,判断选中与否只需读取其所有儿子的状态,若全部儿子都未选中则置未选中并继续激发递归向上动作.
1)预设控制变量nonSelected=true;2)遍历表单所有checkbox元素,对每个checkbox元素each做如下处理:a)取e长度对each.
name求前向的该长度子串;b)若该子串与e.
name相同(说明each为传入e元素的儿子)继续如下处理:ⅰ.
若e为未选中继续a)-b)处理直至表单遍历完毕;ⅱ.
否则置nonSelected=false并退出循环;3)若nonSelected=true,表明所有儿子均未选中,置e未选中.
并用e传入调用upSelect,即向上处理该元素因改变为未选中状态引发的级联效应.
(5)用户选择控制该函数传入事件源checkbox变量e(点击发生处的checkbox),处理除全选控制外的所有checkbox框控制.
处理顺序是先遍历处理置自己子孙checkbox元素的状态,再调用Item函数向上递归处计算机系统应用2010年第19卷第10期232经验交流ExperiencesExchange理置当前节点e的所有祖先checkbox元素的状态,即先往下,再往上的处理顺序.
最后要注意置"全选"控制checkbox的状态.
注意到各checkbox代表的权限和功能点name属性值来自于2.
1处理后的session对象值,都带有祖先权限前缀,因此可借用该特征迅速匹配到当前事件源的子孙元素.
函数处理过程如下:1)求得e.
name.
length,遍历当前form,对当前元素each的name值字符串取自0开始长为length的子串,并与e.
name比较.
若相同,则说明该each页面元素是事件源元素的子孙元素,对其置checked属性为e.
checked属性相同的值.
2)传入e调用upSelect,向上处理祖先checkbox状态,过程见(3)3)预设控制变量allSelected=true;4)遍历表单所有元素,对每个元素each做如下处理:a若each是"全选"checkbox,continue循环;b若each是未选中,置allSelected=false;break退出循环;5)若allSelected=true,表明都选中,置全选控制checkbox为选中.
6小结角色权限控制涉及算法较多,算法异常复杂,限于篇幅本文主要对新增角色时页面角色展现数据预准备算法,以及页面展现后客户的复杂动作逻辑算法给出完整实现.
其它复杂算法有待后继发表,有兴趣读者可与本文作者联系.
参考文献1飞思科技产品研发中心,JSP应用开发详解.
第2版,北京:电子工业出版社,2006.
255-270.
2刘鹏远.
基于角色的权限管理可重用解决方案.
计算机系统应用,2007,16(6):28-31.
3孙卫琴.
精通STRUTS.
北京:电子工业出版,2005.
95-102.
Hostodo发布了几款采用NVMe磁盘的促销套餐,从512MB内存起,最低年付14.99美元,基于KVM架构,开设在拉斯维加斯机房。这是一家成立于2014年的国外VPS主机商,主打低价VPS套餐且年付为主,基于OpenVZ和KVM架构,产品性能一般,数据中心目前在拉斯维加斯和迈阿密,支持使用PayPal或者支付宝等付款方式。下面列出几款NVMe硬盘套餐配置信息。CPU:1core内存:512MB...
tmthosting怎么样?tmthosting家本站也分享过多次,之前也是不温不火的商家,加上商家的价格略贵,之到斯巴达商家出现,这个商家才被中国用户熟知,原因就是斯巴达家的机器是三网回程AS4837线路,而且也没有多余的加价,斯巴达家断货后,有朋友发现TMTHosting竟然也在同一机房,所以大家就都入手了TMTHosting家的机器。目前,TMTHosting商家放出了夏季优惠,针对VPS推...
卢森堡商家gcorelabs是个全球数据中心集大成的运营者,不但提供超过32个数据中心的VPS、13个数据中心的cloud(云服务器)、超过44个数据中心的独立服务器,还提供超过100个数据中心节点的CDN业务。CDN的总带宽容量超过50Tbps,支持免费测试! Gcorelabs根据业务分,有2套后台,分别是: CDN、流媒体平台、DDoS高防业务、块存储、cloud云服务器、裸金属服务器...
字符串数组为你推荐
推广方法产品如何做推广iphone5解锁iphone5怎么解锁吴晓波频道买粉五大知识付费平台有哪些?网站运营刚创业的网站运营怎么做?迅雷云点播账号求百度云或者迅雷云播账号密码怎么点亮qq空间图标QQ空间图标怎么点亮?奇虎论坛奇虎是中国的吗?mate8价格华为mate8手机参数配置如何,多少元bt封杀BT下载可以封杀迅雷吗?什么原理?能破吗?商标注册查询官网商标注册查询官方网站?
看国外视频直播vps 域名备案流程 阿云浏览器 128m内存 国外bt php免费空间 国外网站代理服务器 免费个人网站申请 好看qq空间 40g硬盘 河南移动邮件系统 空间论坛 泉州电信 免费高速空间 hkt 广东主机托管 国外免费云空间 七牛云存储 cdn服务 asp空间 更多