Spring框架和Acegi安全框架介绍

1、spring   框架

  Spring框架是由Open   Source开发的一个优秀的多层J2EE系统框架,它为企业级应用提供了一个非常轻量级的解决方案,大大地降低了应用开发的难度与复杂度,提高了开发的速度。

  Spring框架的核心是IoC和AOP。IoC是一种设计模式,即IoC模式。IoC模式进一步降低了类之间的耦合度,并且改变了传统的对象的创建 方法,实现了一种配置式的对象管理方式,Spring框架中由IoC容器负责配置性的对象的管理。IoC模式极大的提高了系统开发与维护的灵活性。

  AOP是一种编程模式,它是从系统的横切面关注问题。传统的面向对象编程OOP主要从系统的垂直切面对问题进行关注,对于系统的横切面关注很少,或者 说很难关注,这样当考虑到系统的安全性、日志、事务以及其他企业级服务时,OOP就无能为力了,只能在所有相关类中加入类似的系统服务级的代码。AOP为 解决系统级服务问题提供了一种很好的方法。AOP将系统服务分解成方面看待,并为类提供一种声明式系统服务方式。Java类不需要知道日志服务的存在也不 需要考虑相关的代码。所以,用AOP编写的应用程序是松耦合的,代码的复用性就提高了。

  2、Acegi   安全框架

  借助于Spring框架,开发者能够快速构建结构良好的WEB应用,但现有的Spring框架本身没有提供安全相关的解决方案。同样来自于 Open   Source   社区的Acegi安全框架为实现基于Spring框架的WEB应用的安全控制提供了一个很好的解决方案。Acegi本身就是利用Spring提供的IoC 和AOP机制实现的一个安全框架,它将安全性服务作为J2EE平台中的系统级服务,以AOP   Aspect形式发布。所以借助于Acegi安全框架,开发者能够在Spring使能应用中采用声明式方式实现安全控制。

  Acegi安全框架主要由安全管理对象、拦截器以及安全控制管理组件组成。安全管理对象是系统可以进行安全控制的实体,Acegi框架主要支持方法和 URL请求两类安全管理对象;拦截器是Acegi中的重要部件,用来实现安全控制请求的拦截,针对不同的安全管理对象的安全控制请求使用不同的拦截器进行 拦截;安全控制管理部件是实际实现各种安全控制的组件,对被拦截器拦截的请求进行安全管理与控制,主要组件包括实现用户身份认证的 AuthenticationManager、实现用户授权的AccessDecisionManager   以及实现角色转换的RunAsManager。安全管理对象、拦截器以及安全控制管理组件三者关系如图1所示。

  Acegi安全框架在基于Spring框架的系统中的应用

  1、分析系统安全性需求

  首先,需要明确进行安全控制的对象,可为业务方法和URL资源。

  其次,需要进一步明确,系统身份认证资料和资源授权信息的数据持久化形式。

  2、Acegi安全系统数据库设计

  在Acegi框架中支持多种安全信息的持久化方式,可以在配置文件中配置或存放在关系数据库。由于在实际应用中,需求是经常发生变化的。所以,在配置 文件中配置是满足不了实际应用需求的。然而,Acegi本身对权限表的设计非常简单,users表{username,password, enabled}   和authorities表{username,authority},这样简单的设计肯定无法适用复杂的权限需求。为了解决权限管理的复杂性,在这里引 入了role(角色)的概念,使得用户和权限分离,一个用户拥有多个角色,一个角色拥有多个相应的权限,这样就更灵活地支持安全策略。

  同时,为了更好地配合Acegi安全框架,还引入resource(资源)的概念,资源可分为URL和FUNCTION(方法)两种,一个权限可以对应多个资源。具体的数据库设计见图2。



图1   安全管理对象,拦截器和安全管理组件交互图



图2   Acegi安全控制系统数据库设计  

3、认证管理器,授权管理器的配置

  实现系统的安全控制,首先需要对系统的安全管理器和授权管理器进行配置,系统进行认证和授权需要获取安全信息,Acegi本身提供了对认证信息的获取 机制,在实现认证与授权过程中,系统将主动根据配制信息和相应的信息解释安全信息的读取。图3给出了一个将用户安全信息存储在数据库中的认证管理器的配置 示意图。

  对应于图示的XML配置文件的代码如下:








  授权管理器的配置方法与认证管理器的配置基本类似,这里不再讨论。

  4、安全请求拦截器的配置

  以上配置完成后,就需要配置安全拦截器。不同的安全管理对象需要使用不同的安全拦截器。对于方法级的安全认证需要使用的拦截器为 MethodSecurityInterceptor,而应用于URL资源的安全拦截器为FilterSecurityInterceptor   。其中,MethodSecurityInterceptor拦截器是借助于Spring   Aop实现的,而FilterSecurityInterceptor拦截器是借助于Servlet   Filter   实现的。本文以URL资源请求的安全拦截器为例说明配置情况。

  由于URL资源请求安全拦截是借助于过滤器进行的。因此首先要配置Acegi   Servlet过滤器。过滤器类似于AOP   Around装备,实现在web资源调用前后进行的一些操作6种过滤器,他们依次构成Servlet过滤器链,依次处理客户请求。需要注意的是过滤器配置 的顺序是不能交换的,当不需要使用某个过滤器时,可直接将其删除和注释。过滤器在web.xml中配置形式为

<filter>
 <filter-name>Acegi   HTTP   Request   Security   Filter</filter-name>
 <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
 <init-param>
  <param-name>targetClass</param-name>
  <param-value>
   Org.acegisecurity.intercept.web.SecurityEnforcementFilter
  </param-value>
 </init-param>
</filter>
<filter-mapping>
 <filter-name>Acigi   HTTP   Request   Security   Filter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>  

  在spring   applicationContext.xml文件中的配置形式为

<bean   id=”securityEnforcementFilter”   class=””>
 <property   name=”filterSecurityInterceptor”>
  <ref   bean=”filterInvocationInteceptor”/>
 </property>
 <property   name=”authenticationEntryPoint”>
  <ref   bean=”authenticationProcessingFilterEntryPoint”/>
 </property>  

  以上代码是SecurityEnforcementFilter的配置,该过滤器对用户是否有权访问web资源作出最后的决定。其它的过滤器的配置类同。
配置完过滤器后,需要对拦截器FilterSecurityInterceptor进行配置,


  objectDefinitionSource属性定义了那些受保护的URL资源,其中引用了一个本地对象 filterObjectDefinitionSource。filterObjectDefinitionSource类从数据库中读取需要保护的 URL安全信息,它扩展了PathBasedFilterInvocationDefinition   Map类。
同样,实现了另外一个methodObjectDefinitionSource类从数据库中读取需要保护的FUNCTION资源,它扩展了MethodDefinitionMap类。限于篇幅,在这里就不列出具体实现的源代码。



  结束语

  由于Spring在越来越多的项目中的应用,因此基于Spring应用的安全控制系统的研究就显得非常重要。Acegi提供了对Spring应用安全 的支持,然而   Acegi本身提供的实例并不能满足大规模的复杂的权限需求,本文通过扩展Acegi的数据库设计即可满足复杂的权限需求。然而,怎样将Acegi应用到 非Spring的系统中,还有待进一步研究。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值