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

spring security源码分析之一springSecurityFilterChain

 
阅读更多

spring security源码分析之一springSecurityFilterChain

 

1. spring和spring security的集成,配置web.xml如下:

复制代码
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring-security.xml
        </param-value>
    </context-param>

    <!-- Spring Security -->
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
复制代码

2. springSecurityFilterChain的来龙去脉

   在org.springframework.security.config包里定义了该名称:

    /** External alias for FilterChainProxy bean, for use in web.xml files */
    public static final String SPRING_SECURITY_FILTER_CHAIN = "springSecurityFilterChain";
使用springSecurityFilterChain的地方:HttpSecurityBeanDefinitionParser.java 该类建立
Http 安全体系:过滤器栈和受保护的url。

复制代码
    static void registerFilterChainProxyIfNecessary(ParserContext pc, Object source) {
        if (pc.getRegistry().containsBeanDefinition(BeanIds.FILTER_CHAIN_PROXY)) {
            return;
        }
        // Not already registered, so register the list of filter chains and the FilterChainProxy
        BeanDefinition listFactoryBean = new RootBeanDefinition(ListFactoryBean.class);
        listFactoryBean.getPropertyValues().add("sourceList", new ManagedList());
        pc.registerBeanComponent(new BeanComponentDefinition(listFactoryBean, BeanIds.FILTER_CHAINS));

        BeanDefinitionBuilder fcpBldr = BeanDefinitionBuilder.rootBeanDefinition(FilterChainProxy.class);
        fcpBldr.getRawBeanDefinition().setSource(source);
        fcpBldr.addConstructorArgReference(BeanIds.FILTER_CHAINS);
        fcpBldr.addPropertyValue("filterChainValidator", new RootBeanDefinition(DefaultFilterChainValidator.class));
        BeanDefinition fcpBean = fcpBldr.getBeanDefinition();
        pc.registerBeanComponent(new BeanComponentDefinition(fcpBean, BeanIds.FILTER_CHAIN_PROXY));
        pc.getRegistry().registerAlias(BeanIds.FILTER_CHAIN_PROXY, BeanIds.SPRING_SECURITY_FILTER_CHAIN);
    }

}
复制代码

从上面的代码可以看出,springSecurityFilterChain是DelegatingFilterProxy的代理对象。

3.FilterChainProxy

  代理一组spring管理的filter bean来处理request。从spring security2.0以后,除非你需要对filter chain的内容进行严格的控制,否则你就无需显式的在context中配置一个FilterChainProxy。默认的<security:http />命名空间配置选项可以处理绝大部分应用场景。示例如下:

  <http auto-config="true">
    <remember-me key="xxx" token-validity-seconds="xxx" data-source-ref="dataSource"/>
    <form-login login-page="/login.jsp"/>
    <logout logout-success-url="/login.jsp"/>
    <intercept-url pattern="/*" access="ROLE_USER"/>
  </http>

 通过在你的应用中的web.xml中增加一个名为DelegatingFilterProxy标准的spring声明,就可以将FilterChaiProxy链接到servlet 容器的filter chain。

  3.1 配置

  从spring security 3.1版本,FilterChainProxy通过一组SecurityFilterChain实例来配置,每个SecurityFilterChain实例包含一个RequestMacher和一组匹配request的Filter。

  大部分应用只需要包含一个简单的filter chain,若你使用命名空间,你无需显式的设置chain;若你需要一个精确的 控制,你可以使用<filter-chain>命名空间元素。它定义了一个urI匹配模式和一组逗号分隔的、应用到request和url匹配的filter。实例如下:

复制代码
<bean id="myfilterChainProxy" class="org.springframework.security.util.FilterChainProxy">
     <constructor-arg>
         <util:list>
             <security:filter-chain pattern="/do/not/filter*" filters="none"/>
             <security:filter-chain pattern="/**" filters="filter1,filter2,filter3"/>
         </util:list>
     </constructor-arg>
 </bean>
复制代码

 

 3.2 request处理

  HttpFirewall实例用来验证接收的request请求,并且创建一个新的包装后的请求,这个新包装的请求提供了和原请求一致的路径值。

  FilterChainProxy使用firewall实例来获取应用到filter chain的request请求和response响应对象。当request请求通过security filter chain,将调用reset方法,此时将会返回servletPath和pathInfo的原始值,而不是security 模式匹配后的修改值。

  3.3 Filter生命周期

    注意,servlet容器中的filter生命周期和Ioc容器中的filter生命周期不一致。因此建议你使用Ioc容器而不是servlet容器来管理你增加到应用上下文的filter 的生命周期。

  3.4 SecurityFilterChain

       定义了一个filter chain,它能够和HttpServletRequest进行匹配,匹配是为了决定是否需要应用到该request请求。

4. filters预览

  那么spring security有哪些filter呢?

SecurityFilters.java定义了默认的filter及其顺序:

复制代码
 FIRST (Integer.MIN_VALUE),
    CHANNEL_FILTER,
    SECURITY_CONTEXT_FILTER,
    CONCURRENT_SESSION_FILTER,
    /** {@link WebAsyncManagerIntegrationFilter} */
    WEB_ASYNC_MANAGER_FILTER,
    HEADERS_FILTER,
    CSRF_FILTER,
    LOGOUT_FILTER,
    X509_FILTER,
    PRE_AUTH_FILTER,
    CAS_FILTER,
    FORM_LOGIN_FILTER,
    OPENID_FILTER,
    LOGIN_PAGE_FILTER,
    DIGEST_AUTH_FILTER,
    BASIC_AUTH_FILTER,
    REQUEST_CACHE_FILTER,
    SERVLET_API_SUPPORT_FILTER,
    JAAS_API_SUPPORT_FILTER,
    REMEMBER_ME_FILTER,
    ANONYMOUS_FILTER,
    SESSION_MANAGEMENT_FILTER,
    EXCEPTION_TRANSLATION_FILTER,
    FILTER_SECURITY_INTERCEPTOR,
    SWITCH_USER_FILTER,
    LAST (Integer.MAX_VALUE);

    private static final int INTERVAL = 100;
复制代码

测试:

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(SecurityFilters.CHANNEL_FILTER.getOrder());
        System.out.println(SecurityFilters.SECURITY_CONTEXT_FILTER.getOrder());
        System.out.println(SecurityFilters.CONCURRENT_SESSION_FILTER.getOrder());
    }

结果如下:

100
200
300

以此类推:

默认的过滤器顺序列表 
order 过滤器名称
100 ChannelProcessingFilter
200 ConcurrentSessionFilter
300 SecurityContextPersistenceFilter
400 LogoutFilter
500 X509AuthenticationFilter
600 RequestHeaderAuthenticationFilter
700 CasAuthenticationFilter
800 UsernamePasswordAuthenticationFilter
900 OpenIDAuthenticationFilter
1000 DefaultLoginPageGeneratingFilter
1100 DigestAuthenticationFilter
1200 BasicAuthenticationFilter
1300 RequestCacheAwareFilter
1400 SecurityContextHolderAwareRequestFilter
1500 RememberMeAuthenticationFilter
1600 AnonymousAuthenticationFilter
1700 SessionManagementFilter
1800 ExceptionTranslationFilter
1900 FilterSecurityInterceptor
2000 SwitchUserFilter

5. filters架构层次

分享到:
评论

相关推荐

    3.springSecurity源码分析1

    在深入分析SpringSecurity源码之前,我们先了解一些基础概念。 1. DelegatingFilterProxy:这是一个Spring框架提供的过滤器,它作为代理来调用实际的Filter。在web.xml中,filter-name设置为...

    精彩:Spring Security 演讲PPT

    Spring Security 是一个功能强大的安全框架,可以为基于Java的应用程序提供认证(Authentication)、授权(Authorization)等功能,同时提供了丰富的配置选项来满足不同的应用场景需求。 #### 二、传统Web应用安全开发...

    Spring Security 把授权信息写入数据库

    Spring Security是一个强大的安全管理框架,用于处理Java应用程序的安全需求,包括认证和授权。在从Acegi安全框架转换到Spring Security 2.0时,一个重要的变化就是如何将授权信息存储从XML配置文件迁移到数据库。这...

    01-SpringSecurity-Demo.zip

    此外,配合博主的Spring全家桶之SpringSecurity的博文阅读,可以更系统地学习SpringSecurity的配置、使用和最佳实践,从而提升你在安全领域的专业技能。记住,实践是检验理论的最好方式,动手操作这些示例代码,将是...

    myeclipse 8.5的spring security 2.0.5的简单练习(图解)

    本篇文章将详细介绍如何在 MyEclipse 8.5 中使用 Spring Security 2.0.5 来实现一个简单的权限管理示例。Spring Security 是一个功能强大的安全框架,它为 Java 应用程序提供了认证、授权等功能。对于初学者来说,...

    springSecurity简易实例

    在Java Web开发中,Spring Security是一个强大的、高度可定制的身份验证和访问控制框架。本实例将基于JDK 1.7和Maven的阿里镜像来创建一个简单的Spring Security应用,以演示其基本功能。 ### 1. 安装与配置 首先...

    SpringSecurity3.1实际摸索总结

    SpringSecurity 是一个强大的安全框架,主要用于Java应用的安全管理,包括认证和授权。SpringSecurity 3.1 版本在此前的基础上进行了改进和调整,本文将深入探讨其关键知识点。 首先,SpringSecurity 的核心架构...

    Spring Security 3.1.3配置实例

    Spring Security 是一个强大的且高度可定制的访问控制和身份管理框架,广泛应用于Java企业级应用中,用于提供安全服务,如认证、授权等。在这个3.1.3版本的配置实例中,我们将深入探讨如何设置和操作这个框架,以...

    spring-security3 配置和使用

    Spring Security 是一个强大且灵活的安全框架,旨在保护基于 Java 的 Web 应用程序。Spring Security 3 是 Spring Security 框架的第三个主要版本,提供了许多新的功能和改进。下面将详细介绍 Spring Security 3 的...

    maven spring security框架搭建

    根据提供的文件信息,我们可以深入探讨如何使用Maven和Spring Security框架来构建一个安全的应用程序。以下将详细解析各个部分,并介绍这些配置是如何协同工作来确保应用程序的安全性的。 ### Maven依赖 在项目中...

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

    在这个配置中,`contextConfigLocation` 参数指定了 Spring Security 的配置文件路径,而 `&lt;filter&gt;` 节点则配置了一个名为 `springSecurityFilterChain` 的过滤器,该过滤器是 Spring Security 自带的一个代理过滤...

    spring_security3_0_5安全配置手册

    文档中示例了如何配置springSecurityFilterChain过滤器,该过滤器使用DelegatingFilterProxy代理,从而将请求委托给Spring Security提供的过滤器链处理。 #### 5. 命名空间配置 在Spring Security 3.0.5中,通过在...

    spring_security3教程

    然后,我们定义了一个名为`springSecurityFilterChain`的过滤器,它是一个DelegatingFilterProxy,用于委托请求处理给Spring Security。这个过滤器将应用于所有URL,通过`&lt;url-pattern&gt;//*&lt;/url-pattern&gt;`设置。 `...

    利用spring security 给cxf的业务方法添加保护

    Spring Security是一个强大的、高度可定制的身份验证和授权框架,广泛应用于Java环境。本文将深入探讨如何利用Spring Security来保护Apache CXF服务中的业务方法,确保只有经过适当授权的用户才能访问。 Apache CXF...

    Spring Security3 配置使用

    6. **源码分析**:对于深入理解Spring Security的工作原理,阅读源码是十分有帮助的。可以研究`AuthenticationManager`、`FilterSecurityInterceptor`、`AbstractAuthenticationProcessingFilter`等关键类的实现。 ...

    Spring Security简易配置指南

    Spring Security 是一个强大的安全框架,它为Java应用程序提供了全面的安全管理解决方案。在本文档中,我们将探讨如何进行Spring Security的简易配置,以确保你的应用在Spring框架下得到有效的安全保护。 首先,你...

    Spring-security

    注意,过滤器名称必须设定为"springSecurityFilterChain",因为Spring Security默认提供了一个过滤器链。 4. 可以选择自定义过滤器并将其配置为Spring的Bean,但其名称仍然必须是"springSecurityFilterChain"。 5. ...

Global site tag (gtag.js) - Google Analytics