张国平,马 丽
(平顶山学院 软件学院,河南 平顶山 467000)
随着计算机技术和网络技术的不断发展,企业级应用不断走向成熟,J2EE平台也越来越受人们关注,但随着Web应用的不断复杂化,单纯使用J2EE提供的基本组件很难满足用户的需求,同时开发难度也比较大[1],为了降低J2EE开发难度,在Web系统中引入一个容器框架Spring来辅助开发,该框架中的IoC技术和AOP技术可以将应用程序代码中硬编码逻辑剥离出来放到配置文件中从而提高应用的可维护性和组件之间的耦合度[2-3]。
然而,Spring框架并没有提供对企业级应用系统安全性的支持,Acegi是基于Spring的一个开源的安全认证框架,本文对Spring框架集成Acegi安全框架进行了深入的探讨,同时给出了具体的实现方法,从而提高了应用系统的灵活性,安全性,以满足不同企业的安全需求。
Spring是一个轻量级的控制反转 (IoC)和面向切面(AOP)的开源容器框架,它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情[4-5]。然而,Spring的用途不仅限于服务器端的开发。同时可以使你能够编写更干净、更可管理、并且更易于测试的代码,并提供了对其它框架的支持[6]。
Acegi是一个基于Spring Framework的安全框架,它能够与当前流行的Web容器无缝集成[7]。它结合Spring框架为Web系统提供安全和认证安全服务,包括使用拦截器、Bean Context和面向接口的编程方式。因此,Acegi安全系统能够轻松地适用于复杂的安全需求。为了实现对Web服务的保护,Acegi框架提供了以下8个关键功能组件:
1)Authentication 对象,包含了 Principal,Credential和 Principal的授权信息。同时还可以包含关于发起认证请求的客户的其他信息,如IP地址。
2)ContextHolder对象,使用ThreadLocal储存 Authentication对象的地方。
3)AuthenticationManager, 用于认证 ContextHolder中的Authentication对象。
4)AccessDecissionManager,用于授权一个特定的操作。
5)RunAsManager,当执行特定的操作时,用于选择性地替换Authentication对象。
6)Secure Object拦截器,用于协调 AuthenticationManager,AccessDecissionManager,RunAsManager和特定操作的执行。
7)AfterInvocationManager, 用于在 一个 SesureObject运行结束后修改一个对象,比如从 Principal的 authorities集合中移除一些没有访问授权的元素.
8)AfterInvocationManager, 用于在 一个 SesureObject运行结束后修改一个对象,比如从 Principal的 authorities集合中移除一些没有访问授权的元素。
在当前大多数的企业级应用中通常有如下4种基本的安全需求:1)需要对服务层方法进行保护;2)需要对主体进行鉴别;3)需要对web请求进行保护;4)需要对域对象实例进行保护。Acegi提供了一个通用的框架,它可以满足上述4种企业安全级的需求。下面以Acegi在Web应用程序中应用为例,它所能做的工作包括以下几个方面:
①在用户访问受保护资源之前提示用户登录;②鉴别用户是否是系统的合法用户;③鉴别合法用户是否具有访问受保护资源的权限;④通过认证并对已授权的用户导向相应的受保护的资源;⑤当认证用户成功登陆系统后,Acegi会在服务器端表示该用户已通过认证,并且在客户端放置一个安全Cookie,这样,系统的下一个认证过程就可以直接使用该Cookie;⑥用户注销或退出系统的时候,Acegi负责销毁服务器端保存的Session;⑦Acegi负责与不同的数据源交互,以完成对用户信息的认证功能。
在Web工程项目中使用Spring和Acegi安全框架,首先要将Spring、Acegi相应的JAR包下载(可以到相应的官方网站下载),然后导入到工程中。这样当前项目就具备了上述两种安全框架的环境,接下来配置web.xml,该文件用来初始化工程信息的。并将Sping的Ioc容器装载到ServletContext中,并且配置FilterToBeanProxv过滤器。接下来配置Spring的配置文件applicationcontext.xml文件,最后部署并运行项目即可。下面以毕业设计选题系统为例,用Spring和Acegi实现系统的安全与登陆。通过分析得出该系统分为:管理员,教师,学生3种角色,在用户界面中可以实现上述3种用户的登录,要求登陆在一个界面下自动识别,而无需进行身份选择,登陆后,他们将分别到各自的跳转页面。具体的实现步骤如下:
首先修改web.xml,增加安全控制过滤链:
在上述代码中可以看出Acegi实现了Filter接口的FilterToBeanProxy提供一种特殊的使用Filter的方式,它委托Spring中的Bean-FilterChainProxy来完成过滤功能,这样可以简化web.xml的配置,并且利用Spring IOC的优势。FilterChainProxy包含了处理认证过程的filter列表,每个filter都有各自的功能。
接下来在 applicationContext.xml中增加 Acegi安全控制拦截器和Spring的自动代理功能实现AOP代理代码配置如下:
Acegi安全框架为企业级软件开发提供了一个强有力的、灵活的解决方案,是目前开源社区最好安全框架之一。由于Spring框架在越来越多的项目中应用,并且该框架本身没有提供对系统安全方面的支持。因此基于Spring应用的Acegi安全框架的研究就显得非常重要,对安全框架的使用过程中不需要改变原有系统的任何代码,只需要通过配置文件引入即可,真正实现了将安全代码从业务代码中分离。使得业务代码更干净,系统结构更合理。
[1]王爽.基于ASSH框架的运动会信息管理系统设计[J].电子设计工程,2011(10):31-34.
WANG Shuang.Design of games information management system based on ASSH framework[J].Electronic Design Engineering,2011(10):31-34.
[2]刘伟,冯伟.基于SSH和Acegi的Web应用框架的设计与实现[J].软件导刊,2011(7):122-124.
LIU Wei,FENG Wei.Design and implementation of Web application framework based on the SSH and Acegi[J].Software Guide,2011(7):122-124.
[3]张齐,余磊.基于J2EE平台的可配置权限系统的设计与实现[J].信息通讯技术,2008(6):31-36.
ZHANG Qi,YU Lei.The design and implementation of configurable privilege management system based on J2EE platform[J].Information and Communications Technologies,2008(6):31-36.
[4]肖杰,陈翔,何海江.基于AJAX和Struts的Web应用的设计与实现[J].计算机工程与设计,2009(8):1934-1938.
XIAO Jie,CHEN Xiang,HE Hai-jiang.Design and implementation of web application based on AJAX and struts[J].Computer Engineering and Design,2009(8):1934-1938.
[5]傅鹂,殷旻昊.基于Struts+Spring+Hibernate+Ajax技术的科研管理系统设计[J].软件导刊,2009(1):134-136.
FU Li,YIN Min-hao.Design of science research management system based on Struts+Spring+Hibernate+Ajax technology[J].Software Guide,2009(1):134-136.
[6]谌湘倩,狄文辉,孙冬.基于SSH框架与AJAX技术的Java Web应用开发[J].计算机工程与设计,2009,10:2590-2592.
CHEN Xiang-qian,DI Wen-hui,SUN Dong.Application of Java web based on SSH and AJAX[J].Computer Engineering and Design,2009(10):2590-2592.
[7]马 林,黄文培.RBAC的权限扩展和其在Acegi下的实现?[J].微计算机信息,2008(6):34-36.
MA Lin,HUANG Wen-pei.Extended model based on RBAC and its implementation on acegi framework[J].Microcomputer Information,2008(6):34-36.