基于整合了Struts和Hibernate的J2EE架构的用户权限管理系统的设计与实现张震P1P,杨正球P1PP1P北京邮电大学计算机科学技术系,北京(100876)E-mail:HTUzhangzhen223@sohu.comUTH摘要:基于J2EE平台的框架技术是目前开发企业管理信息系统的主流技术。本文阐述了Struts和Hibernate框架技术,并通过分析这两种框架各自的优缺点,设计了整合Struts和Hibernate框架技术的J2EE架构。并指出基于Struts和Hibernate框架的轻量级J2EE架构必将成为开发企业级应用的主流技术。同时本文介绍了基于角色的访问控制理论RBAC的基本概念,在此基础上设计并实现了一个权限管理系统。实践表明,该设计使业务逻辑与访问控制逻辑分开,解决了传统的权限管理系统中代码重复、分散、混乱的问题,具有有效性、可扩展性和可维护性。关键词:权限管理,访问控制RBACStrutsHibernateJ2EE框架1.引言随着java技术的广泛应用,基于J2EE的Web应用系统以其层次性、平台无关性逐渐被大多数的公司所认同。尤其是J2EE提供的中间层集成框架,用来满足没有太多费用而又需要高可用性、高可靠性以及可扩展性的应用需求。其中目前比较流行的就有Struts框架和Hibernate框架。但是Struts框架只解决了视图层、业务层和控制层的分离,并没有对复杂的持久层提供灵活的架构支持,反之,Hibernate框架则提供了灵活的持久层支持,对应用的整体架构却没有任何帮助,因此通过将这两个框架整合起来,可以得到一个迅速地开发灵活、低耦合及易于维护的信息系统的完整解决方案。随着Web服务的复杂度增加以及用户数量和种类的增多,安全问题在理论及工程上都是一个必须考虑的问题,而权限管理是安全问题中一个很重要的方面。为了满足软件代码的可扩展性、通用性、安全性,本文应用了整合Struts和Hibernate框架技术的J2EE架构来实现权限管理系统,同时采用了比较成熟的RBAC(Role-BasedAccessControl,基于角色的访问控制)技术,并将这些应用于中国普天项目信息管理系统。2.系统主要技术2.1基于角色的访问控制RBAC基于角色的访问控制RBAC是美国国家技术与标准局(NIST)提出的一种访问控制技术[5]。它有效地克服了传统访问控制技术中存在的不足之处,可以减少授权管理的复杂性,降低管理开销,而且还能为管理员提供一个比较好的实现安全政策的环境。RBAC的主要思想是:权限(Permissions)是和角色(Roles)相联系的,而用户(Users)则被指定到相应的角色作为其成员。这样就使权限的管理大大简化了。角色是为某机构或组织中多种工作岗位而创建,根据用户职责、能力和资格的不同把他们指派为不同的角色;如果需要也能很容易地改变用户的角色,新的应用、系统集成时,可以给角色授予新的权限或是撤回一些权限。和一个角色相对应的用户集合和权限集合可能只是暂时的,而角色本身则相对稳定得多,因为一个组织或单位的活动或功能一般不会频繁的变动。操作(Operations)指查看、删除、修改、查看等一系列对系统的动作。对象(Objects)包括系统中可操作的数据、系统资源与可监控的系统信息。权限即“操作+对象”,权限往往是一个复杂的问题,但也可简单的表述为这样的逻辑表达式:判断“Who对What(Which)进行How的操作”的逻辑表达式是否为真。如图1所示,为基于角色的访问控制的基本思想。-1-发起的开源项目。它在Java服务器端实现了MVC设计模式。在Struts框架中,模型由实现业务逻辑的JavaBean或EJB组件构成,控制器由ActionServlet和Action来实现,视图由一组JSP文件构成[3]。如图2所示,为Struts实现的MVC框架。图2Struts实现的MVC框架结合上图,这里简单的介绍一下Struts中对应于MVC的Model,View和Controller这三个部分。模型(Model)表示应用程序的业务逻辑和状态,主要由JavaBean、EJB和Java实用类所组成。Struts作为实现MVC模式的框架结构,并没有提供任何模型组件(实现业务逻辑的组件),开发Struts结构应用程序的主要任务之一就是开发符合自己业务逻辑的模型。视图(View)就是一组JSP文件。在这些JSP文件中没有业务逻辑,也没有模型信息,只有标签,这些标签可以是标准的JSP标签或客户化标签,如Struts标签库中的标签。控制器(Controller)由ActionServlet类和Action类来实现。ActionServlet类是Struts框架中的核心组件,它继承了javax.servlet.http.HttpServlet类,在MVC模型中扮演中央控制器的角色。Action类负责调用模型的方法,更新模型的状态,并帮助控制应用程序的流程。对于业务逻辑的操作主要由Action、ActionMapping、ActionForward这几个组件协调完成。其中,Action扮演了真正的控制逻辑的实现者,而ActionMapping和ActionForward则指定了不同业务逻辑或流程的运行方向。2.3Hibernate框架Hibernate是一个面向java环境的对象/关系数据库映射工具。对象/关系数据库映射用来把对象模型表示的对象映射到基于SQL的关系模型结构中去[6]。Hibernate不仅管理java类到数据库表的映射,还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。Hibernate本质上是一个提供数据库服务的中间件,它利用数据库和其他一些配置文件来为应用程序提供数据持久服务。通过简单地设置配置文件和创建XML映射,可以代替大量复杂的JDBC编程。Hibernate架构如图3。-2-提供了好几种不同的运行方式。在轻量型系统中,应用程序自己提供JDBC连接,并且自行管理事务,这种方式使用HibernateAPI的一个昀小子集;在全面解决体系中,对于应用程序来说,所有底层的JDBC/JTAAPI都被抽象了。Hibernate定义了自己的查询语言HQL(HibernateQueryLanguage),并且兼容传统的SQL语法,因此Hibernate可以和多种Web服务器或者应用服务器良好集成,如今已经支持几乎所有流行的数据库服务器。2.4整合Struts和Hibernate的J2EE架构J2EE(Java2PlatformEnterpriseEdition)是SUN公司定义的一套开发分布式企业级应用的规范,它提供了一个多层分布式系统的开发模型和一系列技术规范的支持。基于J2EE可以简化许多与开发、部署和管理中相关的复杂问题,同时具有构件复用,一致的安全模型和灵活的事务控制,与平台无关性等优势。J2EE技术的核心是基于组件/容器的应用,根据所开发系统要实现的功能把应用逻辑分成多个层次,对每个层次提供相应的服务器和组件支持,容器间通过相关协议进行通讯,从而实现组件之间的相互调用,这样极大地方便了Internet/Intranet应用的开发。一个典型的J2EE平台包括了一个或多个容器。J2EE容器是一个用来管理应用程序组件,提供访问J2EEAPI的运行环境。图4展示了J2EE的体系结构,在这个结构里面有两个容器:一个Web容器,其中容纳JavaServlet和JSP组件;一个EJB容器,其中容纳各种企业级JavaBean组件(EJB)。因此,J2EE技术是目前满足企业级应用分布式系统需要的昀好途径之一。-3-:J2EE体系结构根据Struts与Hibernate各自的优点与不足,我们在系统设计时将这两个架构有效整合在一起,让Struts负责降低系统总架构的耦合性,而让Hibernate负责降低业务模型部分的开发难度。集成Struts架构与Hibernate架构的方法是利用Struts架构作为系统的整体基础架构,它负责了MVC的分离,而在Struts架构的模型部分,利用Hibernate架构来提供持久层支持[1]。本系统的整体分层架构如图5所示:StrutsHibernate客户层表示层业务层数据持久层数据库层客户浏览器JSP页面、JSP技术、TagLib控制组件、业务逻辑ActionServlet、Action、JavaBean等O/RMapping、持久对象、JDBC关系数据库图5整合Struts和Hibernate的J2EE架构图3.用户权限管理系统的设计与实现-4-数据库表结构为了实现权限管理系统,一共建立了7张表,分别是:名,用户姓名,用户密码,所属部门,性别,是否为负责人,固定电话,移动电话,电子邮件,状态,职务描述等信息。根据用户名和用户密码判断用户是否有权进入系统以及根据用户提取角色判断用户的权限。功能集合。能(Function)表:保存系统的功能信息,包括功能名称(英文),功能名称(中文)。作(表:保存系统动作的信息,包括动作名称,动作路径,动作参数,验证。动作是权限管理的基本单位,验证属性是为了决定该动作是否需要验证。户包含的角色。)角色功能设置(_Function)表:保存了角色和功能的多对多关系,用来确定角色包含的功能。设置(Function_Action)表:保存了功能和动作的多对多关系,用来确定功能包含的动作。本系统的权限划分的层次结构如图6所示:用户可以对应多个角色,角色可以对应多个功能,而功能可以对应多个动作。在检查首先检查用户拥有的角色,在检查这些角色拥有的功能系统权限管理比较灵活,对权限更改也相当方便。当用户调换部门时,只需更改用户对应的角色[5]。当需要更改角色权限时,只需更改角色对应的功能。Hibernate是采用ORM机制,使得java对象和关系数据可以方便地互相转化。访问数据库的操作,向上提供了面向对象的数据访问,使得程(1)用户(Employee)表:保存用户的基本信息,用户(2)角色(Role)表:保存系统角色信息,包括角色名称(英文),角色名称(中文)(3)功(4)动Action)(5)用户角色设置(Esr)表:保存了角色和用户的多对多关系,用来确定用(6Role(7)功能动作用户角色功能图6权限划分的层次结构动作用户是否被授予执行某项动作的权限时,,在检查这些功能中是否包含此项动作。同时还要根据此项动作的验证属性,判断是否需要对其验证。这样设计使得3.2Hibernate框架的应用Hibernate向下封装了JDBC序员不用去关心底层数据库具体实现[4],减少了操作数据库代码量。同时也使得数据服务层与应用层分离,当底层数据库发生变化时无需改动应用层的代码只要修改Hibernate配置文件即可,增强了系统的可移植性。-5-的工作流程[6]大概分为下面几步:置文件创建一个Configuration实例,它代sionFactory的缓存中。当i象创建Session。据库。如下:-//Hibernate/HibernateConfigurationDTDhibernate-configurationhibernate.dialectorg.hibernate.dialect.SQLServerDialect/propertyrtyrtymapp