利用SPRING SECURITY 3.0构建SPRING+STRUTS+HIBERNATE应用安全性的一种方法
2012-11-04詹劲松刘吴文梁融凌
詹劲松,刘吴文,梁融凌
(福建师范大学福清分校数学与计算机系,福建福清 350300)
利用SPRING SECURITY 3.0构建SPRING+STRUTS+HIBERNATE应用安全性的一种方法
詹劲松,刘吴文,梁融凌
(福建师范大学福清分校数学与计算机系,福建福清 350300)
介绍了Spring Security3.0的认证和权限控制以及Spring+Struts+Hibernate框架,并介绍了利用Spring Security3.0构建Spring+Struts+Hibernate应用安全性的一种方法.对直接使用Spring JDBC的方法进行了比较.
Spring Security 3.0;认证;权限控制;Spring+Struts+Hiberante
安全性是J2EE企业应用的一个重要方面,是一个要从开发项目初期就应该考虑的重要因素.认证和权限控制是应用层安全性的两个主要领域.事实上,Spring security是基于Spring的企业应用安全性的标准.
1 Spring Security 3.0
Spring Security为基于spring的企业级应用提供全面的安全性服务.认证和权限控制也是Spring Security要处理的两个主要领域[1].
在认证层面上,Spring Security支持广泛的认证模型.这些认证模型或者由第三方提供,或者由相关的标准团体开发,Spring Security也提供了自己的一组认证设施.Spring security 3.0的认证由 AuthenticationManager完成,AuthenticationManager调用 AuthenticationProvider进行认证.AuthenticatctionProvider可依赖注入UserDetailsService.
不管认证如何进行,Spring Security提供了一组深入的权限控制服务.它主要面向三个领域:web请求的权限控制,方法调用的权限控制和单个对象实例访问的权限控制[1].Spring Security 3.0权限控制由AbstractSecurityIntercpetor承担,AbstractSecurityInterceptor调用 AccessDecisionManager完成权限控制的最终决定.在通常情况下,AcessDecisionManager轮询一系列的AcessDecisionVoter以做出授权决定.AbstractSecutityInterceptor调用 AcessDecisionManager在对象调用之前进行权限控制,而AfterInvocationManager可以进行调用后处理,每个AfterInvocationManager的实现可以修改返回的对象,或者抛出一个AcessDeniedException让访问无效.
Spring Security的web设施完全基于标准的Servlet过滤器,处理 HttpServletRequest和 HttpServletResponse.Spring Security内部保持一个过滤器链,每个过滤器都有独特的作用,根据服务的需要,在配置中增加、移除过滤器.正是这些过滤器调用相应的对象,实现了Spring Security的认证和权限控制[2].在使用Spring Security的web应用中,关键的过滤器有FilterSecurityInterceptor、ExceptionTranslationFilter、SecurityContextPersistenceFilter和 UsernamePasswordAuthenticationFilter等.前三个过滤器总是出现在Spring Security Web应用配置中,不能用其他过滤器替代.
2 Spring+Struts+Hiberante框架
目前Spring+Struts+Hiberante框架在企业中广泛应用.我们采用分层的架构,分为Action层、Service层和Dao层.用Spring3.0对这些层对象进行管理,采用面向接口的编程方式.向Action中依赖注入Service对象,向Service中依赖注入Dao对象.用 Hibernate3.2实现数据持久化.MVC采用Struts2.1.8.
3 Spring Security 3.0 构建 Spring+Struts+Hibernate应用的安全性
对于一般的J2EE应用,如果数据持久化采用数据库,Spring Security使用Spring JDBC来获得认证信息.Spring Security提供一个JdbcDaoImpl类来实现UserDetailsService接口.如果采用这种方法,那么必须在数据库中创建users和authorities这两个Spring Security专用的表.使用这种方法的优点是它简单直接.
对于Spring+Struts+Hibernate的应用,可以采用以上方法.但是因为本来就使用 ORM框架,所以自定义类实现UserDetailsService接口,充分利用Hibernate框架提供的服务,然后将自定义类对象依赖注入AuthenticationProvider,最终供AuthenticationManager调用.这样做的另一个好处是不需要建立Spring Security专用的表,数据是一个整体,更容易保持数据的一致性.
相关代码如下:
上述代码中Manager类和Role类之间是多对多映射,关键在于不能使用懒加载.
在上述代码中我们利用Hiberante提供的服务查询一个用户名,获得该用户的所有授权,将授权装入GrantedAuthority对象,最后组装成一个User返回.这样,通过自定义类实现了UserDetailsService接口.
我们用Spring Security 3.0对页面访问进行权限控制,同时对Service层的delelte和deleteById方法调用实行权限控制.相关代码如下:
结果:只有通过认证才能访问页面,并且只有用具有ROLE_ADMIN权限的经理才可以删除客户信息.
4 讨论
使用Hibernate懒加载并设置spring的OpenSessionIn-ViewFilter,会造成数据库一直保持连接,最后被JVM强行关闭.故不能使用Hibernate的懒加载.
5 结束语
利用Spring Security 3.0建立 Spring+Struts+Hibernate应用的安全性,自定义类实现UserDetailsService接口,利用Spring Security 3.0的认证机制,并对web请求和方法调用实行权限控制.我们实现了Spring+Struts+Hibernate框架和Spring Security 3.0连接的一种方法.
[1] Alex B,Taylor L.Spring security reference documentation,3.0.7 RELEASE[EB/OL].http://static.springsource.org/spring - security/site/docs/3.0.x/reference/springsecurity.html,2011.
[2]Walls C,Breidenbach R.Spring in Action中文版(第二版)[M].毕庆红,译.北京:人民邮电出版社,2008.
TP311
A
1008-4681(2012)02-0050-02
2012-01-21
福建省教育厅B类科技项目(批准号:JB11263).
詹劲松(1967-),男,福建三明人,福建师范大学福清分校数学与计算机系讲师,硕士.研究方向:信息安全、操作系统.
(责任编校:晴川)