Spring Security在支付宝的使用.docx_第1页
Spring Security在支付宝的使用.docx_第2页
Spring Security在支付宝的使用.docx_第3页
Spring Security在支付宝的使用.docx_第4页
Spring Security在支付宝的使用.docx_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Spring Security在支付宝的使用1. Spring Security简介1.1 Spring Security核心概念Spring Security是一种为基于Spring的应用程序提供说明性安全保护的安全模型。前身是Acegi Security。它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理身份确认和授权。在Spring Framework基础上,Spring Security充分利用了依赖注入和面向切面技术。Spring Security提供两种保护:一种是保护web应用程序;一种是保护方法的调用。在保护Web应用程序时,Spring Security使用Servlet拦截器来拦截Servlet请求,以实施身份认证和执行安全措施。Spring Security采取了一种独特的机制来声明Servlet过滤器,使你可以使用SpringDI注入它所依赖的其他对象。Spring Security还可以通过保护方法调用在一个较低层的级别上执行安全措施。在保护方法时,Spring Security使用Spring AOP来代理对象,将“切面”应用于对象,以确保用户只有在拥有恰当授权时才能调用受保护的方法。Spring Security的核心组件是:安全拦截器。见图1。 图1 Spring Securiy核心组件安全拦截器包括四部分:认证管理器;访问决策管理;运行身份管理器;调用后管理器。在Spring Security中,这些组件的实现见图2 图2 核心组件实现安全拦截器拦截请求之后,会在访问资源之前,依次使用认证管理器,访问决策管理器,运行身份管理器来检查请求是否通过。在访问资源之后,还会使用调用后管理器检查返回的数据。1.2 Spring Security保护资源的流程如图2所示,AbstractSecurityInterceptor代表了安全拦截器,它包含了4个主要属性:1) AuthenticationManager (认证管理器); 2) AccessDecisionManager (访问决策管理器) ;3)RunAsManager(运行身份管理器);4)AfterInvocationManager(调用后管理器)。此外,该类提供了安全拦截的模板方法。Spring Security保护资源的流程就在该类中实现。 1.在安全拦截器被加载时,会调用afterPropertiesSet方法。该方法中会确保一些属性不为空,并依次调用AccessDecisionManager (访问决策管理器) ;RunAsManager(运行身份管理器);AfterInvocationManager(调用后管理器)的support方法。来确认初始化配置是否正确。2.在资源被访问之前。会调用beforeInvocation方法。该方法中会依次调用AuthenticationManager(认证管理器);AccessDecisionManager(访问决策管理器) ;RunAsManager(运行身份管理器)相应的方法,来决定是否允许该请求。如果不允许该请求,则会抛出异常。3.在资源被访问之后。会调用afterInvocation方法。该方法会调用afterInvocationManager的decide方法,决定返回的数据是否允许被查看。4. AbstractSecurityInterceptor中有两个虚方法。getSecureObjectClass和obtainObjectDefinitionSource方法。这两个方法会被AbstractSecurityInterceptor的子类实现。1.2.1 安全拦截器拦截请求在不同的场景下,安全拦截器拦截请求的方式不一样。在保护Web应用程序时,安全拦截器是包装在filter中的。在保护方法调用时,安全拦截器使用Spring AOP来拦截请求。1.2.2 身份认证身份认证的功能由AuthenticationManager (认证管理器)来完成。它负责辨认你是谁。AuthenticationManager接口定义为:public interface AuthenticationManager public Authentication authenticate(Authentication authentication) throws AuthenticationException;其功能是对请求进行身份验证。其具体实现的类图如下: 图3 认证管理器的类图1.2.3 访问决策管理身份认证只是Spring Security安全保护机制的第一步public interface AccessDecisionManager public void decide(Authentication authentication, Object object, ConfigAttributeDefinition config) throws AccessDeniedException, InsufficientAuthenticationException; public boolean supports(ConfigAttribute attribute); public boolean supports(Class clazz);1.2.4 运行身份管理如果你已经通过了认证管理器和访问决策管理器,那么安全拦截器就会被开启,你就可以访问需要的资源。然而,即使你已经通过了身份认证并已经获得了访问某一资源的授权,还可能有其他的安全限制。运行身份管理器可以用来使用另一个身份替换你的身份,从而允许你访问应用程序内部更深处的受保护对象。注意,并不是所有应用程序都需要身份替换。因此,运行身份管理器是一个可选的安全组件,在支付宝的应用中没有使用该组件。1.2.5 调用后管理调用后管理器是在受保护资源被访问之后执行的安全措施。它是用来确保你被允许查看那些受保护资源返回的数据。如果调用后管理器用于一个服务层Bean,那么它将有机会检查从该Bean方法返回的值。接下来,它可以决定当前用户是否被允许查看返回的对象。该调用后管理器还可以修改所返回的值,以确保当前用户只能够访问返回对象的特定属性。与运行身份管理器类似,并不是所有应用程序都会需要调用后管理器。支付宝的应用中没有使用该组件。2. 使用Spring Security保护web应用程序在SpringSecurity中,保护web应用程序是基于web.xml中Filter的。其流程如下: 图4 Spring Security保护web资源的流程然而,web.xml没有依赖注入的概念,也没有直接的方式可以从Spring上下文中获取Bean,然后将它们装配到一个servlet过滤器中。SpringSecurity通过FilterToBeanProxy来解决这一问题。FilterToBeanProxy是一个特殊的Servlet过滤器,它本身做的工作并不多,而是将自己的工作委托给Spring上下文中的一个Bean来完成,如下图。被委托的Bean几乎和其他的Servlet过滤器一样,实现javax.servlet.Filter接口,但它是在Spring配置文件而不是web.xml文件中配置的。这样,就可以使用在过滤器中使用依赖注入了。关于FilterToBeanProxy的使用可见下节。 图5 FilterToBeanProxy的工作原理3. 支付宝中使用SpringSecurity保护web应用程序3.1支付宝对Spring Security的扩展支付宝对Spring Security的扩展都放在alipay-service-security这个项目中。目前主要是针对URL进行访问控制,即使用Spring Security保护web应用程序。支付宝对Spring Security的扩展主要体现在以下几个方面:3.1.1 领域对象的扩展OperationContext作为支付宝的操作上下文,实现了Authentication接口,3.1.2 过滤器的扩展主要扩展了一下几个过滤器:AlipayFilterToBeanProxy:扩展了acegi提供的FilterToBeanProxy,重写了获得Spring上下文的方法。OperationEnvironmentIntegrationFilter:属于集成过滤器,见图4。其作用是在请求最开始时创建操作环境(OperationEnvironment)。AlipayAnonymousProcessingFilter:其主要作用是创建OperationContext对象AlipaySecurityEnforcementFilter:这个Filter封装了安全拦截器。继承了acegi提供的SecurityEnforcementFilter类。该类的功能主要是捕获安全拦截器中组件产生的异常,并将请求转到合适的地方。3.1.3 安全拦截器的扩展见下图:支付宝继承了Acegi的AbstractSecurityInterceptor,重写了getSecurityObjectClass和obtainObjectDefinitionSoucre方法。并实现了Acegi中的ObjectDefinitionSouce。3.1.4 一些工具类在支付宝中,权限的详细信息是保存在security-*.acf文件中的,而不同于原生的Acegi。主要是使用了自己实现的AlipayFilterInvocationDefinitionSourceEditor和ConfigAttributeEditor。以及Text2ObjectFactoryBean类。详细的使用见下节。3.2使用SpringSecurity保护web应用程序的步骤3.2.1 引用相应的包需要引用Sourceforge/acegi第三方库alipay/service/security第二方库。该工程中包含了支付宝对SpringSecurity的扩展。alipay/common/lang第二方库。该工程中包含了支付宝安全相关的领域对象。3.2.2 配置web.xml其实是配置FilterToBeanProxy的Filter。其配置方法如下: Acegi Filter Chain Proxy com.alipay.service.security.acegi.filter.AlipayFilterToBeanProxy targetClassnet.sf.acegisecurity.util.FilterChainProxy beanFactoryConfigclasspath/mktfront-biz-service.xml 注意:这个Filter的class是支付宝对acegi提供的FilterToBeanProxy的扩展,重写了获得Spring上下文的方法。AlipayFilterToBeanProxy的Spring上下文是从mktfront-biz-service.xml文件(包含了mktfront所有需要加载的文件)中获取的。其中,class为net.sf.acegisecurity.util.FilterChainProxy的bean就在该配置文件中被定义。见3.2.3。3.2.3 配置Spring的Bean文件在antx系统中,关于安全的配置都放在配置文件beans-security.xml中。 CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISONPATTERN_TYPE_APACHE_ANT/*=httpSessionContextIntegrationFilter,anonymousProcessingFilter,securityEnforcementFilter这就是AlipayFilterToBeanProxy委托的类,在该类中,配置了3个Filter。1) httpSessionContextIntegrationFilter 直接使用acegi提供的HttpSessionContextIntegrationFilter。主要作用是从HttpSession中获取信息填充安全上下文。2) anonymousProcessingFilter 使用了Alipay自己的AlipayAnonymousProcessingFilter3) securityEnforcementFilter 使用了Alipay自己扩展的AlipaySecurityEnforcementFilter,也是最重要的一个类。其配置如下:!-其中属性filterInvocationInterceptor使用了Acegi提供的FilterSecurityInterceptor。代表了安全拦截器。其配置如下:安全拦截器中所有属性都使用了Alipay扩展的类。authenticationManager是支付宝扩展的身份认证器accessDecisionManager是支付宝扩展的访问决策管理器而objectDefinitionSource是支付宝扩展了acegi的ObjectDefinition

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论