论文部分内容阅读
摘要:分析了基于Web服务的Acegi安全框架的构架和实现原理,以Web服务中的HTTPForm为例,详细阐述了Acegi提供的认证和授权机制,并进一步探讨了Acegi安全框架的权限管理,以满足复杂的企业安全需求,从而提高了Web系统的安全性和稳定性。
关键词:Web服务;认证;授权;权限管理
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)23-897-03
Research and Application of Acegi Security Framework on Web Service
LIU Zhen-hai, YIN Zhao-lin, GENG Wei
(China University of Mining and Technology, Xuzhou 221008, China)
Abstract: Acegi security framework on Web service is analysed. As an example of HTTPForm on Web service, authentication and authorization mechanisms is explicated elaborately. Moreover, this paper discusses purview management of Acegi framework to meet the complex security needs of enterprises and improve the Web system of security and stability.
Key words: Web service; authentication; authorization; purview management
1 引言
随着Web服务技术的发展,安全性往往是企业信息化开发中最为重要的问题之一,如何更好地实现Web应用系统安全成为开发人员所面临的棘手问题。在企业的Web应用系统中,完善、灵活、高效的认证和授权机制是非常必要的,而且由于Web 业务需求面临着不断的变化,这些权限的认证和授权系统应该实现与已有的业务逻辑代码松耦合,传统的Java安全组件都不能很好地融入Web应用系统中,本文采用Spring Framework的Acegi安全框架来实现Web应用系统安全,它的架构和设计目标更符合企业级应用的需求。
2 Acegi框架的安全管理对象
Acegi是一个基于Spring Framework的安全框架,能够和目前流行的Web容器无缝集成。它使用Spring的方式提供安全和认证服务,包括使用Bean Context,拦截器和面向接口的编程方式。通过精心配置Acegi安全系统,能够轻松地适用于复杂的安全需求。Acegi安全系统目前支持3类安全管理对象。
1)MethodInvocation:开发人员可以用它来保护Spring容器中的业务对象。为了使Spring的管理Bean可以作为MethodInvocation使用,Bean可以通过ProxyFactoryBean和BeanNameAutoProxy-Creator来管理,就像在Spring的事务管理中一样使用。
2)FilterInvocation:它通过过滤器(Filter)创建,并简单地包装了HTTP的ServletRequest、ServletResponse和FilterChain。FilterInvocation可以用来保护HTTP资源。通常,开发人员并不需要了解它的工作机制,因为他们只需要将Filter加入web.xml,Acegi安全系统就可以工作了。
3)AspecctJ joinPoint:AspectJ是一个基于Java语言扩展的AOP实现,它提供了强大的AOP功能,在领域对象保护方面特别有用,这些领域对象绝大部分是在Spring容器之外被管理。通过使用AspectJ,一个标准的构造函数,例如:new Person(),能够在正常使用的同时,全面的被Acegi系统保护起来。AspectJSecurityInterceptor是由Spring进行管理的,Spring创建关于方面(aspect)的单实例对象,并且将它与相应的认证管理、存取管理等有效地编织在一起。
每个安全管理对象都可以描述数量不限的各种安全认证请求。例如,FilterInvocation可以描述任意的HTTP URL,而MethodInvocation可以描述带有任意参数的任意方法的调用。
3 Acegi安全框架的分析
为实现对Web服务和POJO对象中方法的保护,Acegi提供了七项重要组件,分别是:
1)Authentication,包含了Principal(用户),Credential(密码)和Principal的授权信息。同时,还可以包含关于发起认证请求的客户的其它信息,如IP地址;
2)ContextHolder,使用ThreadLocal储存Authentication对象的地方;
3)AuthenticationManager(认证管理器),用于认证ContextHolder中的Authentication对象;
4)AccessDecissionManager(访问决定管理器),用于授权一个特定的操作;
5)RunAsManager,当执行特定的操作时,用于选择性地替换Authentication对象;
6)Secure Object拦截器,用于对用户进行认证、授权,或给它赋予不同的角色(RunAsManager);
7)ObjectDefinitionSource,包含特定操作的授权定义。
这7个关键的功能组件的关系如图1所示。
4 Acegi安全框架的实现原理
Acegi安全系统需要记录应用于每个认证请求的安全配置参数。为了保存不同的认证请求的安全配置,需要使用配置参数。从实现的视角来看,配置参数使用ConfigAttribute接口来表示Acegi安全系统提供了ConfigAttribute接口的一个实现SecurityConfig,它把配置参数保存为一个字符串。ConfigAttributeDefinition类是ConfigAttribute对象的一个简单的容器,它保存了和特定请求相关的ConfigAttribute的集合。
在采用了Acegi框架的Web系统中,如果用户请求访问受保护的资源,Acegi就会对请求进行拦截,然后进行认证、授权;如果审查通过,则用户访问成功,否则失败。首先安全拦截器把获得的Authentication对象存在SecurityContextHolder中的ThreadLocal对象中;然后认证管理器从SecurityContextHolder取出用户信息,认证管理器的具体实现者DaoAuthenticationProvider从数据库取出用户信息,它通过比较从数据库获取的用户信息、密码以及从ThreadLocal里取出的Authentication对象中传入的主体、凭证完成身体验证。如果用户名、密码与主体、凭证分别匹配,则用户通过身份验证,同时返回给认证管理器一个已完全填充的Authentication对象,否则会抛出一个异常,表明验证失败;最后,如果认证成功,Acegi框架调用访问决策管理器来实现用户的授权。访问决策管理器的投票者根据用户具有的权限来对用户是否用权访问资源进行投票,Acegi框架根据投票结果进行判断用户是否有权访问资源,如图2所示。
5 Web服务中Acegi框架的实现及权限管理
5.1 Web服务中Acegi框架的实现
这里以Web服务中的HTTPForm认证为例,说明Acegi认证和授权原理:
1)首先通过HttpSessionContextIntegrationFilter初始化ContextHolder中的内容。如果session中已经存在Context,则直接初始化到ContextHolder中,否则创建一个新的Context,此时url为/j_secuirty_check。
2)进入用户登录系统,Acegi从AuthenticationProcessingFilter中得到用户的登录信息(包括Principal和Credentia1),然后,调用AuthenticationManager进行认证。若认证通过,返回带有Principal授权信息的Authentication对象,此时ContextHolder中Authentication对象已拥有Principal的详细信息;若认证失败,则转到“authenticationFailureUrl”。用户从AuthenticationProcessingFilter中得到用户的登录信息,其配置如下:
<bean id="authenticationProcessingFilter"
class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager><ref local="authenticationManager"/></property>
<propertyname="authenticationFailureUrl"><value>/login.jsp?error=true</value></property>
<property name="defaultTargetUrl"><value>/</value></property>
<property name="filterProcessesUrl"><value>/j_security_check</value></property>
</bean>
3)用户登录成功后,继续进行业务操作。
4)安全拦截器(filterInvocationInterceptor)收到客户端操作请求后,将操作请求的数据包装成安全管理对象(FilterInvocation对象)。然后,从配置文件(ObjectDefinitionSource)中读出相关的安全配置参数ConfigAttributeDefinition:
<bean id="filterInvocationInterceptor"
class="net.sf.acegisecurity.intercept.web.FilterSecuirtyInterceptor">
<property name="authenticationManager"><ref local="authenticationManager"/></property>
<property name="accessDecisionManager"><ref local="accessDecisionManager"/></property>
<propertyname="objectDefintionSource">
<value>CONVERT_URL_TO_LOW ERCASE_BEFLRE_CONPARISON
PATTERN_TYPE_APACHE_ANT
/signup.html*ROLE_ANONYM OUS,admin,tomcat
/passwordhint.html*=ROLE_ANONYM OUS,admin,tomcat
/**/*.html*=admin.tomcat
/clickstreams.jsp*admin</value></property></bean>
5)接着,安全拦截器取出ContextHolder中的Authentication对象,把它传递给AuthenticationManager进行身份认证,并用返回值更新ContextHolder的Authentication对象:
6)将Authentication对象、ConfigAttributeDeifnition对象和安全管理对象交给AccessDecisionManager,检查Principal的操作授权;
7)如果授权检查通过,则执行客户端请求的动作,否则拒绝。
5.2 Acegi安全框架的权限管理
企业级系统中,资源的权限配置一般将其存储在数据库中来管理。通过自定义的类urlDefinitionSource来实现权限配置信息向数据库的移植,它扩展了PathBasedFilterInvationDefinitionMap类,用作从数据库结构中读取权限配置信息并存储在内存中,其配置为:
<bean id="urlDefinitionSource" class="sboss.framework.acegi.urlDefinitionSource">
<property name="urlResourceProvider"><ref local="urlResourceProvider"/></property>
</bean>
<bean id="urlResourceProvider" class="sboss.framework.acegi.urlResourceProviderImpl">
<property name="dataSource"><ref bean="dataSource"/></property>
<property name="Cache"><ref local="sourceCache"></property>
</bean>
代码中,Cache是给urlResourceProvider加的一层缓存,目的在于把权限信息存于其中,避免反复的访问数据库影响系统性能。方法调用的拦截器MethodSecurityInterceptor与URL的拦截器有所不同,它是借助于Spring AOP实现的。但其配置与filterInvocationInterceptor类似,它的权限配置也涉及到面向数据库的移植,这里通过类businessDefinitionSource来实现,它扩展了MethodDefinitionMap类,用户从数据库结构中读取权限配置信息并存储在内存中。
权限配置面向数据库的移植的过程中,我们加入了cache(缓存),其好处在于当系统读取一次权限配置信息后,即把该信息存于内存的cache中,当下次需要用到的时候,直接从cache中获取而不用再次去访问数据库,这会节约大量的系统性能。但这也带来另一个问题,如果通过系统操作改变了数据库中的权限配置,而cache中存储的是先前数据库中的信息,势必会导致权限的混乱。这时就需要对cache中的权限信息作数据同步处理。
这里采用AOP技术来实现数据同步:利用Spring AOP拦截修改权限配置的业务方法,在该业务方法执行之后,重新从数据库读取权限配置信息放入cache中。该过程通过自定义的拦截器retrieveDefinitionSourceInterceptor来实现。配置如下:
<bean id="retrieveDefinitionSourceInterceptor"
class="org.springframework.aop.RegexpMethodPointcutAdvisor">
<property name="advice"><ref bean="refreshResourceCache"/></property>
<property name="pattern">
<list><value>sboss.framework.web.action.RoleAction.add</value>
<value>sboss.framework.web.action.RoleAction.update</value></list></property>
</bean>
类refreshResourceCache实现从数据库重新读取权限配置信息再存入cache。
6 结束语
本文主要探讨的将Acegi安全框架应用于Web服务中的方法对于构建安全的系统具有重要的参考意义,同时解决了Web服务中的权限管理问题,实现了数据的同步处理,提高了Web服务系统的安全性。
参考文献:
[1] 夏榆滨,宣明付.基于RBAC的统一权限管理系统研究[J].微计算机信息,2006,22(30):114-116.
[2] 罗时飞.精通Spring[M].北京:电子工业出版社,2005.
[3] Acegi Security System contactssample[EB/OL].http://acegisecurity.org.
[4] Joseph D,Nicholas Lesiecki.精通AspectJ[M].北京:清华大学出版社,2005.
[5] 魏楚元,李陶深,张增芳.J2EE安全机制的分析与研究[J].计算机工程与设计,2005,26(6):1434-1437.
关键词:Web服务;认证;授权;权限管理
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)23-897-03
Research and Application of Acegi Security Framework on Web Service
LIU Zhen-hai, YIN Zhao-lin, GENG Wei
(China University of Mining and Technology, Xuzhou 221008, China)
Abstract: Acegi security framework on Web service is analysed. As an example of HTTPForm on Web service, authentication and authorization mechanisms is explicated elaborately. Moreover, this paper discusses purview management of Acegi framework to meet the complex security needs of enterprises and improve the Web system of security and stability.
Key words: Web service; authentication; authorization; purview management
1 引言
随着Web服务技术的发展,安全性往往是企业信息化开发中最为重要的问题之一,如何更好地实现Web应用系统安全成为开发人员所面临的棘手问题。在企业的Web应用系统中,完善、灵活、高效的认证和授权机制是非常必要的,而且由于Web 业务需求面临着不断的变化,这些权限的认证和授权系统应该实现与已有的业务逻辑代码松耦合,传统的Java安全组件都不能很好地融入Web应用系统中,本文采用Spring Framework的Acegi安全框架来实现Web应用系统安全,它的架构和设计目标更符合企业级应用的需求。
2 Acegi框架的安全管理对象
Acegi是一个基于Spring Framework的安全框架,能够和目前流行的Web容器无缝集成。它使用Spring的方式提供安全和认证服务,包括使用Bean Context,拦截器和面向接口的编程方式。通过精心配置Acegi安全系统,能够轻松地适用于复杂的安全需求。Acegi安全系统目前支持3类安全管理对象。
1)MethodInvocation:开发人员可以用它来保护Spring容器中的业务对象。为了使Spring的管理Bean可以作为MethodInvocation使用,Bean可以通过ProxyFactoryBean和BeanNameAutoProxy-Creator来管理,就像在Spring的事务管理中一样使用。
2)FilterInvocation:它通过过滤器(Filter)创建,并简单地包装了HTTP的ServletRequest、ServletResponse和FilterChain。FilterInvocation可以用来保护HTTP资源。通常,开发人员并不需要了解它的工作机制,因为他们只需要将Filter加入web.xml,Acegi安全系统就可以工作了。
3)AspecctJ joinPoint:AspectJ是一个基于Java语言扩展的AOP实现,它提供了强大的AOP功能,在领域对象保护方面特别有用,这些领域对象绝大部分是在Spring容器之外被管理。通过使用AspectJ,一个标准的构造函数,例如:new Person(),能够在正常使用的同时,全面的被Acegi系统保护起来。AspectJSecurityInterceptor是由Spring进行管理的,Spring创建关于方面(aspect)的单实例对象,并且将它与相应的认证管理、存取管理等有效地编织在一起。
每个安全管理对象都可以描述数量不限的各种安全认证请求。例如,FilterInvocation可以描述任意的HTTP URL,而MethodInvocation可以描述带有任意参数的任意方法的调用。
3 Acegi安全框架的分析
为实现对Web服务和POJO对象中方法的保护,Acegi提供了七项重要组件,分别是:
1)Authentication,包含了Principal(用户),Credential(密码)和Principal的授权信息。同时,还可以包含关于发起认证请求的客户的其它信息,如IP地址;
2)ContextHolder,使用ThreadLocal储存Authentication对象的地方;
3)AuthenticationManager(认证管理器),用于认证ContextHolder中的Authentication对象;
4)AccessDecissionManager(访问决定管理器),用于授权一个特定的操作;
5)RunAsManager,当执行特定的操作时,用于选择性地替换Authentication对象;
6)Secure Object拦截器,用于对用户进行认证、授权,或给它赋予不同的角色(RunAsManager);
7)ObjectDefinitionSource,包含特定操作的授权定义。
这7个关键的功能组件的关系如图1所示。
4 Acegi安全框架的实现原理
Acegi安全系统需要记录应用于每个认证请求的安全配置参数。为了保存不同的认证请求的安全配置,需要使用配置参数。从实现的视角来看,配置参数使用ConfigAttribute接口来表示Acegi安全系统提供了ConfigAttribute接口的一个实现SecurityConfig,它把配置参数保存为一个字符串。ConfigAttributeDefinition类是ConfigAttribute对象的一个简单的容器,它保存了和特定请求相关的ConfigAttribute的集合。
在采用了Acegi框架的Web系统中,如果用户请求访问受保护的资源,Acegi就会对请求进行拦截,然后进行认证、授权;如果审查通过,则用户访问成功,否则失败。首先安全拦截器把获得的Authentication对象存在SecurityContextHolder中的ThreadLocal对象中;然后认证管理器从SecurityContextHolder取出用户信息,认证管理器的具体实现者DaoAuthenticationProvider从数据库取出用户信息,它通过比较从数据库获取的用户信息、密码以及从ThreadLocal里取出的Authentication对象中传入的主体、凭证完成身体验证。如果用户名、密码与主体、凭证分别匹配,则用户通过身份验证,同时返回给认证管理器一个已完全填充的Authentication对象,否则会抛出一个异常,表明验证失败;最后,如果认证成功,Acegi框架调用访问决策管理器来实现用户的授权。访问决策管理器的投票者根据用户具有的权限来对用户是否用权访问资源进行投票,Acegi框架根据投票结果进行判断用户是否有权访问资源,如图2所示。
5 Web服务中Acegi框架的实现及权限管理
5.1 Web服务中Acegi框架的实现
这里以Web服务中的HTTPForm认证为例,说明Acegi认证和授权原理:
1)首先通过HttpSessionContextIntegrationFilter初始化ContextHolder中的内容。如果session中已经存在Context,则直接初始化到ContextHolder中,否则创建一个新的Context,此时url为/j_secuirty_check。
2)进入用户登录系统,Acegi从AuthenticationProcessingFilter中得到用户的登录信息(包括Principal和Credentia1),然后,调用AuthenticationManager进行认证。若认证通过,返回带有Principal授权信息的Authentication对象,此时ContextHolder中Authentication对象已拥有Principal的详细信息;若认证失败,则转到“authenticationFailureUrl”。用户从AuthenticationProcessingFilter中得到用户的登录信息,其配置如下:
<bean id="authenticationProcessingFilter"
class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager><ref local="authenticationManager"/></property>
<propertyname="authenticationFailureUrl"><value>/login.jsp?error=true</value></property>
<property name="defaultTargetUrl"><value>/</value></property>
<property name="filterProcessesUrl"><value>/j_security_check</value></property>
</bean>
3)用户登录成功后,继续进行业务操作。
4)安全拦截器(filterInvocationInterceptor)收到客户端操作请求后,将操作请求的数据包装成安全管理对象(FilterInvocation对象)。然后,从配置文件(ObjectDefinitionSource)中读出相关的安全配置参数ConfigAttributeDefinition:
<bean id="filterInvocationInterceptor"
class="net.sf.acegisecurity.intercept.web.FilterSecuirtyInterceptor">
<property name="authenticationManager"><ref local="authenticationManager"/></property>
<property name="accessDecisionManager"><ref local="accessDecisionManager"/></property>
<propertyname="objectDefintionSource">
<value>CONVERT_URL_TO_LOW ERCASE_BEFLRE_CONPARISON
PATTERN_TYPE_APACHE_ANT
/signup.html*ROLE_ANONYM OUS,admin,tomcat
/passwordhint.html*=ROLE_ANONYM OUS,admin,tomcat
/**/*.html*=admin.tomcat
/clickstreams.jsp*admin</value></property></bean>
5)接着,安全拦截器取出ContextHolder中的Authentication对象,把它传递给AuthenticationManager进行身份认证,并用返回值更新ContextHolder的Authentication对象:
6)将Authentication对象、ConfigAttributeDeifnition对象和安全管理对象交给AccessDecisionManager,检查Principal的操作授权;
7)如果授权检查通过,则执行客户端请求的动作,否则拒绝。
5.2 Acegi安全框架的权限管理
企业级系统中,资源的权限配置一般将其存储在数据库中来管理。通过自定义的类urlDefinitionSource来实现权限配置信息向数据库的移植,它扩展了PathBasedFilterInvationDefinitionMap类,用作从数据库结构中读取权限配置信息并存储在内存中,其配置为:
<bean id="urlDefinitionSource" class="sboss.framework.acegi.urlDefinitionSource">
<property name="urlResourceProvider"><ref local="urlResourceProvider"/></property>
</bean>
<bean id="urlResourceProvider" class="sboss.framework.acegi.urlResourceProviderImpl">
<property name="dataSource"><ref bean="dataSource"/></property>
<property name="Cache"><ref local="sourceCache"></property>
</bean>
代码中,Cache是给urlResourceProvider加的一层缓存,目的在于把权限信息存于其中,避免反复的访问数据库影响系统性能。方法调用的拦截器MethodSecurityInterceptor与URL的拦截器有所不同,它是借助于Spring AOP实现的。但其配置与filterInvocationInterceptor类似,它的权限配置也涉及到面向数据库的移植,这里通过类businessDefinitionSource来实现,它扩展了MethodDefinitionMap类,用户从数据库结构中读取权限配置信息并存储在内存中。
权限配置面向数据库的移植的过程中,我们加入了cache(缓存),其好处在于当系统读取一次权限配置信息后,即把该信息存于内存的cache中,当下次需要用到的时候,直接从cache中获取而不用再次去访问数据库,这会节约大量的系统性能。但这也带来另一个问题,如果通过系统操作改变了数据库中的权限配置,而cache中存储的是先前数据库中的信息,势必会导致权限的混乱。这时就需要对cache中的权限信息作数据同步处理。
这里采用AOP技术来实现数据同步:利用Spring AOP拦截修改权限配置的业务方法,在该业务方法执行之后,重新从数据库读取权限配置信息放入cache中。该过程通过自定义的拦截器retrieveDefinitionSourceInterceptor来实现。配置如下:
<bean id="retrieveDefinitionSourceInterceptor"
class="org.springframework.aop.RegexpMethodPointcutAdvisor">
<property name="advice"><ref bean="refreshResourceCache"/></property>
<property name="pattern">
<list><value>sboss.framework.web.action.RoleAction.add</value>
<value>sboss.framework.web.action.RoleAction.update</value></list></property>
</bean>
类refreshResourceCache实现从数据库重新读取权限配置信息再存入cache。
6 结束语
本文主要探讨的将Acegi安全框架应用于Web服务中的方法对于构建安全的系统具有重要的参考意义,同时解决了Web服务中的权限管理问题,实现了数据的同步处理,提高了Web服务系统的安全性。
参考文献:
[1] 夏榆滨,宣明付.基于RBAC的统一权限管理系统研究[J].微计算机信息,2006,22(30):114-116.
[2] 罗时飞.精通Spring[M].北京:电子工业出版社,2005.
[3] Acegi Security System contactssample[EB/OL].http://acegisecurity.org.
[4] Joseph D,Nicholas Lesiecki.精通AspectJ[M].北京:清华大学出版社,2005.
[5] 魏楚元,李陶深,张增芳.J2EE安全机制的分析与研究[J].计算机工程与设计,2005,26(6):1434-1437.