`
wangyanlong0107
  • 浏览: 499584 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

DelegatingFilterProxy管理过滤器详解

 
阅读更多

 

安全过滤器链 
Spring Security的web架构是完全基于标准的servlet过滤器的。它没有在内部使用servlet或任何其他基于servlet的框架(比如spring mvc),所以它没有与任何特定的web技术强行关联。 它只管处理HttpServletRequest和HttpServletResponse,不关心请求时来自浏览器,web服务客户端,HttpInvoker还是一个AJAX应用。 

Spring Security维护了一个过滤器链,每个过滤器拥有特定的功能,过滤器需要服务也会对应添加和删除。过滤器的次序是非常重要的,它们之间都有依赖关系。 如果你已经使用了命名空间配置,过滤器会自动帮你配置, 你不需要定义任何SpringBean,但是有时候你需要完全控制Spring过滤器链,因为你使用了命名空间没有提供的特性,或者你需要使用你自己自定义的类。 

1. DelegatingFilterProxy 
当使用servlet过滤器时,你很需要在你的web.xml中声明它们, 它们可能被servlet容器忽略。在SpringSecurity,过滤器类也是定义在xml中的spring bean, 因此可以获得Spring的依赖注入机制和生命周期接口。spring的DelegatingFilterProxy提供了在 web.xml和applicationcontext之间的联系。 
当使用DelegatingFilterProxy,你会看到像web.xml文件中的这样内容: 

  1.  
    <filter>
  2.  
    <filter-name>myFilter</filter-name>
  3.  
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  4.  
    </filter>
  5.  
    <filter-mapping>
  6.  
    <filter-name>myFilter</filter-name>
  7.  
    <url-pattern>/*</url-pattern>
  8.  
    </filter-mapping>

注意这个过滤器其实是一个DelegatingFilterProxy,这个过滤器里没有实现过滤器的任何逻辑。DelegatingFilterProxy做的事情是代理Filter的方法,从application context里获得bean。这让bean可以获得spring web application context的生命周期支持,使配置较为轻便。bean必须实现javax.servlet.Filter接口,它必须和filter-name里定义的名称是一样的。查看DelegatingFilterProxy的javadoc获得更多信息。 
2. FilterChainProxy 
现在应该清楚了,你可以声明每个Spring Security过滤器bean,你在application context中需要的。把一个DelegatingFilterProxy入口添加到web.xml, 确认它们的次序是正确的。这是一种繁琐的方式,会让web.xml显得十分杂乱,如果我们配置了太多过滤器的话。我们最好添加一个单独的入口,在web.xml中,然后在application context中处理实体,管理我们的web安全bean。 这就是FilterChainProxy所做的事情。它使用DelegatingFilterProxy(就像上面例子中那样),但是对应的class是org.springframework.security.web.FilterChainProxy。过滤器链是在application context中声明的。这里有一个例子: 

  1.  
    <bean id="filterChainProxy"class="org.springframework.security.web.FilterChainProxy">
  2.  
     
  3.  
    <sec:filter-chain-map path-type="ant">
  4.  
     
  5.  
    <sec:filter-chain pattern="/webServices/**" filters="securityContextPersistenceFilterWithASCFalse,basicAuthenticationFilter, exceptionTranslationFilter,filterSecurityInterceptor" />
  6.  
     
  7.  
    <sec:filter-chain pattern="/**" filters="securityContextPersistenceFilterWithASCFalse, formLoginFilter,exceptionTranslationFilter, filterSecurityInterceptor"/></sec:filter-chain-map>
  8.  
     
  9.  
    </bean>

你可能注意到FilterSecurityInterceptor声明的不同方式。命名空间元素filter-chain-map被用来设置安全过滤器链。它映射一个特定的URL模式,到过滤器链中,从bean名称来定义的filters元素。它同时支持正则表达式和ant路径,并且只使用第一个出现的匹配URI。在运行阶段FilterChainProxy会定位当前web请求匹配的第一个URI模式,由filters属性指定的过滤器bean列表将开始处理请求。过滤器会按照定义的顺序依次执行,所以你可以对处理特定URL的过滤器链进行完全的控制。 
你可能注意到了,我们在过滤器链里声明了两个SecurityContextPersistenceFilter(ASC是allowSessionCreation的简写,是SecurityContextPersistenceFilter的一个属性)。因为web服务从来不会在请求里带上jsessionid,为每个用户代理都创建一个HttpSession完全是一种浪费。如果你需要构建一个高等级最高可扩展性的系统,我们推荐你使用上面的配置方法。对于小一点儿的项目,使用一个HttpSessionContextIntegrationFilter(让它的allowSessionCreation默认为true)就足够了。 

在有关声明周期的问题上,如果这些方法被FilterChainProxy自己调用,FilterChainProxy会始终根据下一层的Filter代理init(FilterConfig)和destroy()方法。这时,FilterChainProxy会保证初始化和销毁操作只会在Filter上调用一次,而不管它在过滤器链中被声明了多少次)。你控制着所有的抉择,比如这些方法是否被调用或targetFilterLifecycle初始化参数DelegatingFilterProxy。默认情况下,这个参数是false,servlet容器生命周期调用不会传播到DelegatingFilterProxy。 

当我们了解如何使用命名控制配置构建web安全。我们使用一个DelegatingFilterProxy,它的名字是“springSecurityFilterChain”。你应该现在可以看到FilterChainProxy的名字,它是由命名空间创建的。 

2.1. 绕过过滤器链 
通过命名空间,你可以使用filters = "none",来提供一个过滤器bean列表。这会朝向请求模式,使用安全过滤器链整体。注意任何匹配这个模式的路径不会有任何授权或校验的服务起作用,它们是可以自由访问的。 

3. 过滤器顺序 
定义在web.xml里的过滤器的顺序是非常重要的。不论你实际使用的是哪个过滤器,<filter-mapping>的顺序应该像下面这样: 
ChannelProcessingFilter,因为它可能需要重定向到其他协议。 
ConcurrentSessionFilter,因为它不使用SecurityContextHolder功能,但是需要更新SessionRegistry 来从主体中放映正在进行的请求。 
SecurityContextPersistenceFilter,这样 SecurityContext可以在web请求的开始阶段通过SecurityContextHolder建立,然后SecurityContext的任何修改都会在web请求结束的时候(为下一个web请求做准备)复制到HttpSession中。 
验证执行机制 - UsernamePasswordAuthenticationFilter,CasAuthenticationFilter, BasicAuthenticationFilter 等等 - 这样SecurityContextHolder 可以被修改,并包含一个合法的 Authentication请求标志。 
SecurityContextHolderAwareRequestFilter,如果,你使用它,把一个SpringSecurity提醒HttpServletRequestWrapper安装到你的servlet容器里。 
RememberMeAuthenticationFilter,这样如果之前的验证执行机制没有更新SecurityContextHolder,这个请求提供了一个可以使用的remember-me服务的cookie,一个对应的已保存的Authentication对象会被创建出来。 
AnonymousAuthenticationFilter,这样如果之前的验证执行机制没有更新SecurityContextHolder,会创建一个匿名Authentication对象。 
ExceptionTranslationFilter,用来捕捉 SpringSecurity异常,这样,可能返回一个HTTP错误响应,或者执行一个对应的AuthenticationEntryPoint。 
FilterSecurityInterceptor,保护web URI。 
4. 使用其他过滤器 —— 基于框架 
如果你在使用SiteMesh,确认Spring Security过滤器在SiteMesh过滤器之前调用。这可以保证SecurityContextHolder为每个SiteMesh渲染器及时创建。 
5. 其他配置例子 
方法一: 
web.xml配置一个 

  1.  
    <filter>
  2.  
    <filter-name>DelegatingFilterProxy</filter-name>
  3.  
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  4.  
    <init-param>
  5.  
    <param-name>targetBeanName</param-name>
  6.  
    <param-value>myFilter</param-value> //自己过滤器的名字
  7.  
    </init-param>
  8.  
    <init-param>
  9.  
    <param-name>targetFilterLifecycle</param-name>
  10.  
    <param-value>true</param-value>
  11.  
    </init-param>
  12.  
    </filter>
  13.  
     
  14.  
    <filter-mapping>
  15.  
    <filter-name>DelegatingFilterProxy</filter-name>
  16.  
    <url-pattern>/*</url-pattern>
  17.  
    </filter-mapping>



方法二: 
web.xml配置一个 
  

  1.  
    <filter>
  2.  
    <filter-name>myFilter</filter-name>
  3.  
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  4.  
    <init-param>
  5.  
    <param-name>targetFilterLifecycle</param-name>
  6.  
    <param-value>true</param-value>
  7.  
    </init-param>
  8.  
    </filter>
  9.  
     
  10.  
    <filter-mapping>
  11.  
    <filter-name>myFilter</filter-name>
  12.  
    <url-pattern>/*</url-pattern>
  13.  
    </filter-mapping>




方法一或者二不同的地方就是在web.xml中的写法不同而已没有太大的区别,配完web.xml之后还要配置applicationContext.xml中的bean。 

  1.  
    applicationContext.xml配置:
  2.  
    <bean id="myFilter"class="com.bjtu.filter">//指名具体的filter类
  3.  
    <propertyname="service"> //需要注入的具体参数
  4.  
    <refbean="service"/>
  5.  
    </property>
  6.  
    </bean>
  7.  
    <bean id="service"parent="baseTransactionProxy">//这里的service封装了所有对数据库的操作
  8.  
    <propertyname="target">
  9.  
    <beanclass="com.maimaiche.service.MaiMaiCheServiceImpl">
  10.  
    ......
  11.  
    </bean>
  12.  
    </property>
  13.  
    </bean>




-------------------------------------------------- 
1、web.xml 

  1.  
    <!-- 所有filter,委托给spring -->
  2.  
    <filter>
  3.  
    <filter-name>appFilters</filter-name>
  4.  
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  5.  
    <init-param>
  6.  
    <param-name>targetFilterLifecycle</param-name>
  7.  
    <param-value>true</param-value>
  8.  
    </init-param>
  9.  
    </filter>
  10.  
    <filter-mapping>
  11.  
    <filter-name>appFilters</filter-name>
  12.  
    <url-pattern>/*</url-pattern>
  13.  
    </filter-mapping>
 

2、applicationContext-filter.xml 


  1.  
    <bean id="appFilters" class="org.springframework.security.util.FilterChainProxy">
  2.  
    <security:filter-chain-map path-type="ant">
  3.  
    <security:filter-chain filters="characterEncodingFilter,commonParamsFilter"
  4.  
    pattern="/**" />
  5.  
    </security:filter-chain-map>
  6.  
    </bean>
  7.  
     
  8.  
    <bean id="characterEncodingFilter" class="org.springframework.web.filter.CharacterEncodingFilter">
  9.  
    <property name="encoding" value="UTF-8" />
  10.  
    <property name="forceEncoding" value="true" />
  11.  
    </bean>
  12.  
    <bean id="commonParamsFilter" class="com.renren.wap.fuxi.filter.CommonParamsFilter" />


分享到:
评论

相关推荐

    全面解析Spring Security 过滤器链的机制和特性

    Spring Security 过滤器链机制和特性详解 Spring Security 过滤器链是 Spring Security 框架中的一种核心机制,负责处理 HTTP 请求的安全验证和授权。今天,我们将深入探讨 Spring Security 过滤器链的机制和特性,...

    spring监听器

    ### Spring监听器与过滤器详解:关键代码与实践应用 #### 标题解析与核心概念 标题“spring监听器”指向了Spring框架中一个重要的组件——监听器(Listener)。Spring框架不仅在Java企业级开发中提供了强大的依赖...

    Spring 管理filter 和servlet

    ### Spring管理Filter与Servlet详解 在现代Web应用开发中,Spring框架因其强大的依赖注入和面向切面编程功能而被广泛采用。特别是在Java EE环境中,如何有效地整合Spring与Servlet、Filter等核心组件,对于构建高...

    spring security 3.0.5中文详解

    - **配置web.xml**:在项目的`web.xml`文件中添加过滤器,通常会使用`DelegatingFilterProxy`来代理一个由Spring管理的过滤器Bean。这样做可以让过滤器受益于Spring的生命周期管理。 ```xml &lt;filter-name&gt;...

    Springside Security详解

    在Spring Security的过滤链中,有多个预定义的过滤器,例如: - **CHANNEL_FILTER**:处理HTTP和HTTPS通道切换。 - **CONCURRENT_SESSION_FILTER**:管理并发会话,防止会话劫持。 - **SESSION_CONTEXT_INTEGRATION...

    Apache Shrio安全框架实现原理及实例详解

    - `DelegatingFilterProxy`:一个通用过滤器,可以代理多个其他过滤器,简化配置。 **5. Shiro与Spring整合** Shiro可以通过Spring的DelegatingFilterProxy与Spring应用整合,这使得Shiro可以作为Spring的过滤器...

    spring2.5 的 security 权限验证

    Spring Security的核心在于其过滤器链,其中包含了一系列预定义的过滤器,如`DelegatingFilterProxy`、`FilterSecurityInterceptor`等。每个过滤器都有特定的职责,例如`UsernamePasswordAuthenticationFilter`负责...

    Spring Security 2.0 中文参考文档

    这是Spring Security与Servlet容器交互的关键,它将Spring的AOP代理应用到过滤器中,使得我们可以利用Spring的依赖注入和配置管理。 #### 2.2 `HttpServletRequestWrapper` 和 `HttpServletResponseWrapper` ...

    Spring Security模块

    2. **过滤器链**:Spring Security 的过滤器链开始工作,首先是 `DelegatingFilterProxy`,它将请求转发给 Spring Security 的过滤器链。 3. **匿名身份验证**:如果用户尚未登录,Spring Security 会提供一个匿名...

    spring security3配置

    为了使Spring Security能够在Web环境中正常工作,需要在`web.xml`中配置一个名为`springSecurityFilterChain`的过滤器,该过滤器是Spring Security的核心组件之一,用于处理所有的HTTP请求。 ```xml ...

    Spring Security3.1高级详细开发指南

    2. **复杂示例**:这个示例结合了第二种和第三种配置方法的特点,即用户和权限存储在数据库中,资源 URL 通过配置文件管理,同时引入自定义过滤器和接口实现。这种方式能够更好地模拟真实世界的应用环境,同时提供了...

    spring-security-3.1.0.RC3

    每个过滤器都有特定的职责,如`DelegatingFilterProxy`用于委托给Spring Security的其他过滤器,`HttpServletRequestWrapperFilter`用于包装请求以增加安全性。 2. **身份验证(Authentication)**:当用户尝试访问...

    SpringSecurit安全权限管手册

    SpringSecurity基于过滤器链进行工作,这一章将详解各个核心过滤器的作用,如DelegatingFilterProxy、ChannelProcessingFilter、LogoutFilter等,以及它们在请求处理流程中的位置和功能。 7. **第七章:单点登录**...

    SpringSecurity3.0 教程

    每个过滤器都有特定的任务,如`HttpServletRequestWrapper`用于包装请求,`DelegatingFilterProxy`用于委托到Spring的Bean。 2. **Authentication Manager**:负责处理认证请求,可以自定义认证策略,例如基于...

    Spring3 Security中文教程

    每个过滤器都有特定的任务,如`HttpServletRequestWrapperFilter`用于包装请求,`DelegatingFilterProxy`用于委托给Spring Bean。 5. **访问决策管理器(Access Decision Manager)**:这个组件负责决定用户是否...

    boot-SPTools.zip

    通常,我们需要配置`ShiroConfig`类,设置Realm(认证和授权信息的来源),并利用`@DelegatingFilterProxy`注册Shiro过滤器。 在我们的压缩包"boot-SPTools.zip"中,包含了"DB"和"项目源码"两个部分。"DB"可能包含...

    一些常用的有关java的chm文档

    核心过滤器如`DelegatingFilterProxy`、`ChannelProcessingFilter`、`HttpSessionAuthenticationStrategy`等共同构建了强大的安全防护网。 4. **会话管理**: - **会话固定保护**:Spring Security可以帮助防止...

    spring 3 security

    Spring Security通过一系列的过滤器(如`DelegatingFilterProxy`、`ChannelProcessingFilter`、`SecurityContextHolderAwareRequestFilter`等)来拦截请求,执行安全逻辑。过滤器链的配置可以根据需求进行自定义。 ...

    Spring security

    例如,`HttpServletRequest` 在到达应用程序之前会经过一系列的安全过滤器,如 `DelegatingFilterProxy`、`FilterSecurityInterceptor` 等。 4. **安全上下文**:Spring Security 的安全上下文持有当前用户的认证...

    shiro整合ssmDemo可直接运行

    在Spring的配置文件中,声明Shiro的Bean,如SecurityManager、FilterChainResolver等,并通过Spring的`DelegatingFilterProxy`将Shiro的Web过滤器代理到Spring容器中。 #### 3.4 配置Web.xml 在Web应用的`web.xml`...

Global site tag (gtag.js) - Google Analytics