第6卷第15期2006年8月科学技术与工程Vol.6No.15Aug.2006222ScienceTechnologyandEngineeringZ2006Sci.Tech.Engng.16711815(2006)15236404B/S系统的用户权限设计与实现郭艺峰刘万军13(辽宁工程技术大学电子与信息工程系,软件学院1,葫芦岛125105)摘要针对B/S系统中的用户权限访问控制的问题,提出了一种基于角色访问控制和WebServices技术的用户权限设计。利用角色访问控制技术可以有效地实现用户访问权限的动态管理,而WebServices提供的高度互操作性和访问性能够很好地完成对用户权限的验证。在某油田无线数据管理信息系统中,将两者结合起来,取得了较好的效果。关键词角色WebServicesB/S系统用户权限RBAC中图法分类号TP311.52;文献标识码AInternet的出现和发展,为信息的传播、交换、共享提供了快捷有效的方法,互联网的流行催生了B/S(浏览/服务)这种新的交互方式,同时也对传统的基于C/S(客户/服务)的信息系统造成强大冲击。用户群在广度和深度上的扩展,系统服务的升级和管理的便利性,都使得基于B/S的信息系统更具生命力。然而,Internet的开放性与信息系统对用户权限约束之间的矛盾也加剧了。B/S系统这种方式提高了对网络安全的要求,因为用户是分布式的,浏览器成为其进行系统访问的主要工具,用户端的限制很少,而且网络中的信息以明文的方式进行传输,缺少必要的用户权限控制往往导致严重的安全漏洞。因此,B/S系统的用户权限管理成为研究热点。本文提出一种基于角色访问控制和WebServ2ices技术的用户权限设计方案能有效解决系统资源的访问权限控制问题。1基本原理2006年4月5日收到第一作者简介:郭艺峰(1981—),男,福建漳州人,硕士研究生,研究方向:计算机软件理论及其应用。E-Mail:guoyifeng@so2hu.com。3通信作者简介:刘万军(1959—),男,辽宁北宁人,教授,主要研究方向:人工智能、软件理论。1.1RBAC基于角色的访问控制(RoleBasedAccessCon2trol,RBAC)是一种灵活、高效的访问控制方法,它有效地克服了传统访问控制(DAC,MAC等)技术中存在的不足,可以减少授权管理的复杂性,降低管理开销。RBAC在用户和权限之间引入了角色的概念,安全管理员根据实际需要定义各种角色,并设置和角色相对应的访问权限,而用户根据其职责被指派为不同的角色。这样,访问权限和角色相关联,角色再与用户关联,从而实现了用户与访问权限的逻辑分离。RBAC的基本思想可简单地用图1表示,即把整个访问控制过程分为两步:①角色指派,用户与角色相关联,通过角色使用户与访问权限在逻辑上分离;②权限指派,使角色与访问权限相关联。图1RBAC的基本思想由于RBAC实现了用户与访问权限的逻辑分离,因此它便于权限管理。例如,如果一个用户的职位发生变化,只要将用户当前的角色去掉,由代表新职务或新任务的角色代替即可,角色/权限之间的变化比角色/用户关系之间的变化相对要慢得多,并且委派用户为某角色不需要很多技术,可以由行政管理人员来执行,而配置权限到角色的工作15期郭艺峰,等:B/S系统的用户权限设计与实现2365比较复杂,需要一定的技术,可以由专门的技术人员来承担,但是不给他们委派用户的权限,这与现实中情况正好一致。1.2WebServicesWebServices是近几年发展起来的新一代Web技术,是一种可以建立相互操作的分布式应用程序的新平台,它可以发布、定位、被Web页面中的程序调用。与传统的Web应用方式相比,WebServices是松耦合的,可灵活实现跨厂商、跨平台、跨语言的应用。WebServices技术平台中立,与开发工具、程序语言无关,提供同步与非同步的程序调用,可以在广域网内很好地使用,互操作性较好,可以方便地部署和访问,非常适合于企业信息系统集成。WebServices采用XML描述与服务交互需要的接口,使用WSDL文件进行说明。通过UDDI进行注册,通过SOAP协议在Web上提供访问服务,并与实现服务的硬件平台、软件平台和编程语言无关。使用者只需通过简单的接口即可调用相关的WebServices。2用户权限的设计与实现作者开发的某油田无线数据管理信息系统是一个基于B/S的信息系统,该系统包含有油井信息管理、现场设备管理、油井数据管理等多个功能,每个功能模块又包含有若干个子功能项。系统的用户可以有很多级别,如局领导级、各采油厂领导级、科研单位工程人员级、普通职员级等。不同的用户被授予不同的系统使用权限,并且同一用户在系统运行的不同时段其权限也有可能发生动态变化(如人员调动)。因此采用了RBAC方法,对系统访问权限实施动态管理,简化和规范授权操作,确保对系统资源的正确和安全访问。下面将从数据库设计、添加角色和WebServ2ices的应用等三方面来阐述具体实现过程。2.1数据库中表的设计根据该企业对系统的访问控制要求,在数据库中设计模块表、功能表和角色表等三个表。(1)模块表(ModuleTable)为了管理好用户的权限,首先要组织好系统的模块,为此设计了一个模块表。该的表结构如表1。表1模块表(ModuleTable)表结构字段名类型约束描述moduleNointidentifyprimarykey模块编号moduleNamevarchar(20)notnullunique模块名称moduleNumintnotnull该模块具有的功能数(2)模块功能表(ModuleFuncTable)每个功能模块所具有的子功能称为功能,如油井信息管理模块(属于功能模块的范畴)包含油井信息新增、油井信息查看、油井信息更新、油井信息删除四种功能,模块功能表的表结构如表2。表2模块功能表(ModuleFuncTable)表结构字段名类型约束描述funcNointidentifyprimarykey功能编号funcNamevarchar(20)notnullunique功能名称moduleNointnotnullunique该功能所属的模块编号(3)角色表(RoleTable)角色表包括角色编号,角色名称,角色值和角色描述字段。表结构如表3。表3角色表(RoleTable)表结构字段名类型约束描述roleNointidentifyprimarykey角色编号roleNamevarchar(20)notnullunique角色名称roleValuevarchar(100)notnullunique角色值roleDescvarchar(100)角色描述角色表的设计关键在于角色值的定义,它是一个由‘0’和‘1’组成的类似二进制数的字符串。而功能表中的funcNo(功能编号)字段表示该功能在角色表的roleValue(角色值)字段中的位置,如果该2366科学技术与工程6卷位置对应的数值是‘0’,表示该角色无此权限,如果值为‘1’,则表示该角色拥有此权限。如角色普通职员的角色值为10010000(共100位),并且油井信息新增的功能编号为1,角色值10010000的第1位为‘1’,所以该普通职员角色拥有油井信息新增的功能;相反,该角色值的第2位为‘0’,而功能编号为2的功能为油井信息更新,所以该普通职员角色没有油井信息更新的权限。它们的关系可由图2来表示。图2角色值与功能编号关系2.2角色的添加有了上面几个表,角色页面的功能模块以及其对应的功能都可以从功能模块表和功能表中读出,如图3所示。图3角色添加在将新角色普通职员插入数据库时,先将角色值的所有位都置为‘0’,然后利用字符串函数将角色值中打上勾的功能,它相应的功能编号位的值改为‘1’。例如,新添加一个角色名为普通职员的角色,它拥有的功能为油井信息新增(功能编号1)和油井信息更新(功能编号4)两项,则角色值应为100100000(100位),即角色值中第1位和第4位的值为‘1’,其余为‘0’。2.3利用WebServices实现用户权限访问控制本系统是基于J2EE平台上开发的,开发工具选用Borland公司的JBuilderX,WebServices部署在中间件服务器WebLogic7上。具体实现如下。(1)按照J2EE的规范编写具体的业务方法,值得注意的是应该在客户端访问与数据持久层之间加上业务代理(BusinessDelegate),通常是Session2Bean。客户端通过SessionBean调用CMP中的方法,使CMP用来实现数据库访问,执行单纯的数据读取和修改工作,而把与客户端的接口与抽象表达业务逻辑留给SessionBean来完成,这样软件的重用性、可维护性和可移植性更强,各个Bean所实现的功能更加明确;而且这样做时CMP为LocalEntity2Bean,其性能比客户端直接连接CMP时的Remo2teEntityBean有很大的提高,根程序(stub)与骨架程序(skeleton)之间网络传输更快,可以有效地解决数据库存取的瓶颈问题。(2)启动WebLogic7服务,将业务方法打包部署在WebLogic上并测试通过。(3)在JBuilderX中新建一个WebServices,选择WebServicesConfiguration。在配置的过程中所使用的WebServicesToolkit选择WebLogic,如果Applica2tionModule还没有建立,请先建立。最后完成,JBuilder将会自动创建所需要的文件,非常方便开发。(4)打开WebServicesDesigner,新建一个“JavaServices”填写要部署该WebServices的名称,选择类(这里是一个SessionBean)。编译工程并将其部署到WebLogic7上,发布成功后可以在JBuilderX的控制台上看到相关的发布信息。WebServices的发布、绑定与调用的接口由WSDL文件完成,JBuilder也自动地创建该文件,当成功发布后可以查看该WSDL文件,片段说明如下。⋯⋯〈!—消息声明--〉〈messagename=checkPower〉〈partname=intValxmlns:partns=htp://=partns:int/〉〈/message〉⋯⋯〈!—操作功能声明--〉〈portTypename=PrivilegeBusinessPort〉15期郭艺峰,等:B/S系统的用户权限设计与实现2367〈operationname=checkPower〉〈inputmessage=tns:checkPower/〉〈outputmessage=tns:checkPowerResponse/〉〈/operation〉〈!—绑定声明--〉〈bindingname=PrivilegeBusinessPortSoapBindingtype=tns:Privi2legeBusinessPort〉〈soap:bindingstyle=rpctransport=〉〈operationname=checkPower〉〈soap:operationsoapAction=style=rpc/〉〈/binding〉〈!—服务声明--〉〈servicename=PrivilegeBusiness〉〈documentation〉todo:addyourdocumentationhere〈/documentation〉〈/service〉(5)由于JBuilder也可以在编译的时候生成客户端的调用包,所有当在Servlet或JSP中调用WebServices时只需import进来,然后引用该WebServ2ices方法,代码片段如下:StringwsdlUrl=