基于Acegi的Web系统安全架构的设计与实现
2011-04-20周平杜海舟张超
周平,杜海舟,张超
(上海电力学院计算机与信息工程学院,上海 200090)
Java EE框架日益成熟,为企业的开发应用提供了良好服务和支持.随着基于Java EE平台企业级应用程序的日益增加,如何保证Web应用程序安全[1]是信息系统架构师与开发人员亟待解决的重要问题之一.
Acegi可以为企业应用提供强大而灵活的安全访问控制解决方案.Acegi又称为Spring Security,是基于Spring Framework[2]的安全框架,能够和目前主流的Web容器无缝集成.Acegi充分利用Spring的IoC(Inversion of Control)和AOP (Aspect Oriented Programming)功能,提供声明式安全访问控制的功能[3].
通过对Acegi精心配置和编程就可以实现复杂的安全需求.本文主要研究了如何使用Acegi对应用程序实现安全访问控制,以上海市研究生学术网站为例,设计并实现了一个基于Acegi的安全应用系统,并验证了Acegi框架对保护Web应用程序安全、有效、可行.
1 Acegi安全控制粒度及组件
1.1 Acegi安全控制粒度
针对应用程序Acegi提供了3个方面的安全控制策略,可以实现业务对象方法级的安全访问控制粒度.
(1)对URL资源的访问控制URL资源包括JSP页面、Servlet,以及网站图片等.客户端向Web服务器发送一个URL请求,这个请求首先被Acegi的Servlet过滤器拦截.Acegi从配置文件或Web上下文中读取该用户的信息(可以是匿名用户),判断用户是否有权访问目标资源.授权者允许访问,而未授权者将被拒绝.同时将认证成功的用户名、密码、授权等信息存到Acegi的上下文容器中,目的是为了以后对资源访问验证授权时可以直接从Acegi容器中获取此用户的所有授权.在配置文件中定义用户授权访问的一些URL资源路径时,可使用正则表达式.
(2)对业务类的访问控制业务类即Java Bean或Bean,可实现业务的逻辑功能,包含增加、删除、查询用户等方法.在调用Bean所有方法前,Acegi将检查用户的访问控制列表ACL(Aeccess Control List),查看其是否包含正要进行操作的Bean对象,只有Bean对象被授权时,程序才可以调用该对象中的方法.因此,可通过在数据库中定义用户授权调用Bean类的方法来控制对业务类的访问.
(3)对Bean方法的访问控制Bean方法访问控制比Bean访问控制粒度更小,前者是对Bean中所有方法进行控制,后者是在未对Bean访问控制下对Bean中的部分方法进行控制.我们对用户管理Bean增加和删除用户的方法进行控制,而查询方法不受控制.当用户的请求引发调用Bean的受控方法时,Acegi通过Spring AOP[4]对容器中Bean的受控方法进行拦截,阻止未授权者的调用.Spring容器中所有Bean的方法都可以被Acegi管理.
1.2 Acegi安全框架主要组件
Acegi安全框架主要由过滤器、管理器、提供者和处理程序等4种主要类型的组件组成[5].
(1)过滤器是处在Acegi最高级的组件.当用户请求服务器资源时,首先被Acegi过滤器拦截进行安全认证,但过滤器本身并没有实现这些安全服务,而是将用户信息提交给安全认证的管理器处理.
(2)管理器作为管理者,它本身不提供安全服务,但可以依据配置文件的不同调度相应的安全提供者程序.Acegi的管理器将在运行时选择合适的提供者.
(3)提供者主要提供较低级的安全服务.提供者与不同类型的数据通信,并提供用户的身份验证信息,如从数据库或配置文件里读出用户名和密码,在用户的Cookie里读出身份信息或在Session里读出身份验证信息,获取这些信息后进行安全验证.
(4)处理程序供提供者程序调用,如会话无效处理程序、删除用户的Cookie处理程序等.
2 Acegi认证授权流程
Web应用程序系统的安全一般由认证和授权两个方面构成[6].认证是确认用户的身份.在Acegi安全系统中,需要被认证的用户、系统或代理称为“Principal”.授权是应用程序决定用户访问Web内容的方法.总的来说,决定用户的授权需要先对用户进行身份验证.通过验证后,就可以使用安全服务或由安全服务来决定用户的授权.Acegi认证授权流程包括认证流程和授权流程两部分.
2.1 认证流程
认证流程分为以下4个步骤.用户通过认证后,进入授权流程.认证流程见图1.
(1)过滤器拦截URL请求当用户登陆时,Acegi通过Authentication Processing Filter过滤器拦截登陆请求URL,获取Principal和Credential信息(即用户名和密码).
(2)认证管理器调用相应的提供者验证用户名密码Authentication Processing Filter过滤器调用Authentication Manager进行验证.Authentication Manager本身没有实现验证的功能,它是通过调用提供者(provider)来进行验证的.一个管理者可以具有多个提供者程序,但只要有一个提供者验证通过,管理者就认为验证成功.此外,还可以在配置文件中配置提供者程序.
(3)提供者进行验证是真正的验证模块,并且决定了验证的模式.目前Acegi提供了Dao,Jaas,Cas,X509,Ldap等几种验证方式.通过验证后,提供者将Authentication对象返回.
(4)认证成功保存用户信息Authentication Processing Filter将对象保存到Context Holder中,并为以后的验证使用提供程序性能.
图1 Acegi认证流程
2.2 授权流程
授权流程分为拦截用户请求、鉴权和投票3步.
(1)拦截用户请求用户提交请求,拦截器Filter Security Interceptor拦截请求,拦截器本质上也是一个过滤器.
(2)鉴权拦截器调用Access Decision Manager进行鉴权,主要是通过投票的方式来决定用户是否有权限访问资源.投票包括参与者和策略两方面.投票的参与者Decision Voters是Access Decision Manager的一个属性,可决定用户是否能访问资源.例如Role Voter用来判断用户是否有访问资源的权限,Maxuser Voter用以决定某个资源的访问用户数是否达到最大值等.投票策略是由Acegi提供的Affirmative Based对象,其策略就是只要有一个投票通过就全体通过.Unanimous Based对象的策略是必须全体投票通过才能通过.
(3)投票投票类必须实现Access Decision Voter接口,可通过Vote方法来完成.Vote方法返回一个int型的数据代表投票结果,它们是Access Decision Voter的3个静态成员属性,即ACCESS_ ABSTAIN,ACCESS-DENIED和ACCESS_ GRANTED,分别表示弃权、否决和赞成.
3 基于Acegi上海市研究生学术网站的安全设计与实现
3.1 网站组织结构
上海市研究生学术网站(以下简称学术网站)是一个针对高校在校学生学术交流的平台.网站由前台与后台两个部分构成.前台程序一般用户(不需要认证)可以进行在线浏览学术会议公告、会议新闻、咨询会议问题,以及会议注册等.对于注册用户(注册并通过认证)可以提交会议论文,并进行论文状态查询等.网站后台部分由管理员对网站内容进行管理,如发布会议信息、公告、新闻、会议论文管理,以及会议注册人员管理等.学术网站采用典型的MVC(即业务层Model,界面层View,控制层Controller)架构,安全设计使用AOP技术,其架构如图2所示.
图2 网站MVC架构设计
3.2 网站安全设计
网站安全设计主要包括访问用户的分组、网站安全数据库的设计,以及Acegi配置文件的编写.
3.2.1 访问用户分组
针对该网站需求,我们根据角色不同将用户分为4种类型:一是一般用户,不需要注册,即可访问普通URL资源;二是注册用户,可以向会议提交论文;三是会议管理组,即针对特定会议的管理员小组,该组成员可以对特定会议进行管理,具备接受与会者的注册及其论文等功能;四是网站管理组,可分配会议管理员权限,该组成员及权限分配可通过数据库表映射.
3.2.2 网站安全数据库的设计
根据Acegi安全保护粒度所支持的3种类型——URL资源、业务对象、业务方法等,本网站将安全信息在数据库中作持久化保存.这些安全信息主要由用户表、权限表、角色表、资源表等组成.在设计过程中遵循一个用户拥有多个角色,一个角色拥有多个相应的权限,一个权限可以对应多个资源的设计原则.
这样,配置可以更灵活地使用Acegi安全策略.该数据库设计见图3.
图3 Acegi认证部分数据库表
3.2.3 Acegi配置文件的编写
(1)配置过滤器链通过Filter Chain Proxy定义一个Authentication Processing Filter的过滤器链.这个过滤器链可匹配所有的URL请求.
(2)配置认证过滤器Authentication Processing Filter配置主要有选择认证管理器、处理用户身份认证服务所在的URL(Filter Processes Url)、认证成功后转向的URL(Default Target Url),以及认证失败后转向的URL(Authentication Failure Url)等.
(3)配置认证管理者Provider Manager使用Dao来获取用户名和密码,Dao Authentication Provider通过比较从数据库中获取的用户名和密码以及来自认证管理器的通过Authentication对象中传入的主体和凭证完成身份验证.
(4)配置基于Dao的认证提供者Dao Authentication Provider主要功能是从数据库中提取用户名和密码,并存放到Cache中,以便今后再次使用.
(5)配置授权管理器这一步主要配置投票策略等.
4 结论
(1)利用Acegi框架可以显著减轻程序员负担,提高工作效率;
(2)可通过配置文件静态配置资源与角色的映射,但如果在程序运行期间用户提出动态改变权限分配要求,则需要动态调整相应的配置策略;
(3)需要对Acegi与其他开源项目特别是SSH开源框架的集成作进一步研究.
[1]林青,许锁坤.基于J2EE的企业级系统持久性框架的设计与实现[J].计算机工程与设计,2007(7):1 732-1 734.
[2]HARROPRob,MACHACEK Jan.Spring专业开发指南[M].北京:电子工业出版社,2006:135-189.
[3]W ILLIAM Stallings.Cryptography and network security:principles and practices[M].3th Edition.NJ:Prentice Hall,2003:9-89.
[4]SPRING.Acegi security reference[EB/OL].[2010-05-20]http://www.acegisecurity.org/reference.html.
[5]BILAL Siddiqui,FREELANCE consultant,WAX-SYS.Securing Java applications with Acegi[EB/OL].[2007-05-09]http://www.ibm.com/developerworks/cn/java/j-acegi1.
[6]魏楚元,李陶深,张增芳.J2EE安全机制的分析与研究[J].计算机工程与设计,2005(6):1 434-1 437.
(编辑苏娟)