三保护业务方法

    从第一篇文章中我们已经了解到,Spring Security使用Servlet过滤器来拦截用户的请求来保护WEB资源,而这里却是使用Spring 框架的AOP来提供对方法的声明式保护。它通过一个拦截器来拦截方法调用,并调用方法安全拦截器来保护方法。

    在介绍之前,我们先回忆一下过滤器安全拦截器是如何工作的。过滤器安全拦截器首先调用AuthenticationManager认证管理器认证用户信息,如果用过认证则调用 AccessDecisionManager访问决策管理器来验证用户是否有权限访问objectDefinitionSource中配置的受保护资源。

    首先看看如何配置方法安全拦截器,它和过滤器安全拦截器一方继承自AbstractSecurityInterceptor抽象类(请看源代码),如下:


1  
   < 
   bean  
   id 
   ="methodSecurityInterceptor" 
   
 
   2  
   class 
   ="org.springframework.security.intercept.method.aopalliance.MethodSecurityInterceptor" 
   
 
   3  
       p:authenticationManager-ref 
   ="authenticationManager" 
   
 
   4  
       p:accessDecisionManager-ref 
   ="accessDecisionManager" 
   > 
   
 
   5  
        
   < 
   property  
   name 
   ="objectDefinitionSource" 
   > 
   
 
   6  
           
   < 
   value 
   > 
       
              com.test.service.UserService.get*=ROLE_SUPERVISOR
 
   7  
           
   </ 
   value 
   > 
   
 
   8  
        
   </ 
   property 
   > 
   
 
   9  
   </ 
   bean 
   >


    这段代码是不是很眼熟啊,哈哈~,这和我们配置的过滤器安全拦截器几乎完全一样,方法安全拦截器的处理过程实际和过滤器安全拦截器的实现机制是相同的,这里就在累述,详细介绍请参考< Spring Security 学习总结一>中相关部分。但是也有不同的地方,那就是这里的objectDefinitionSource的配置,在等号前面的不在是URL资源,而是需要保护的业务方法,等号后面还是访问该方法需要的用户权限。我们这里配置的com.test.service.UserService.get*表示对com.test.service包下UserService类的所有以get开头的方法都需要ROLE_SUPERVISOR权限才能调用。这里使用了提供的实现方法MethodSecurityInterceptor,系统还给我们提供了aspectj的实现方式,这里不在介绍(我也正在学…),读者可以参考其它相关资料。

    之前已经提到过了,Spring Security使用Spring 框架的AOP来提供对方法的声明式保护,即拦截方法调用,那么接下来就是创建一个拦截器,配置如下:


1  
   < 
   bean  
   id 
   ="autoProxyCreator" 
   
 
    2  
   class 
   ="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" 
   > 
   
 
    3  
        
   < 
   property  
   name 
   ="interceptorNames" 
   > 
   
 
    4  
           
   < 
   list 
   > 
   
 
    5  
           
   < 
   value 
   > 
   methodSecurityInterceptor 
   </ 
   value 
   > 
   
 
    6  
           
   </ 
   list 
   > 
   
 
    7  
        
   </ 
   property 
   > 
   
 
    8  
        
   < 
   property  
   name 
   ="beanNames" 
   > 
   
 
    9  
           
   < 
   list 
   > 
   
 
   10  
               
   < 
   value 
   > 
   userService 
   </ 
   value 
   > 
   
 
   11  
           
   </ 
   list 
   > 
   
 
   12  
        
   </ 
   property 
   > 
   
 
   13  
   </ 
   bean 
   >


    userService是我们在applicationContext.xml中配置的一个Bean,AOP的知识不是本文介绍的内容。到这里保护业务方法的配置就介绍完了。