Spring Security原理篇(五) 默认过滤器

在上一篇文章中我们最后给出了一张图


Spring Security原理篇(五) 默认过滤器_第1张图片
默认过滤器

我们看到我们没有配置任何东西的时候,spring security为我们加载了11个过滤器
这些过滤器哪里来的?
这篇文章先回答这个问题,然后在说说我们默认的过滤器的作用,重要的过滤器我们后面再通过几篇文章重点说。因为我们知道这些过滤器,我们还要知道怎么通过配置我们让过滤器按照我们的思路去完成逻辑

1.默认过滤器的来源

默认过滤器是怎么配置进来的呢?我们前面有说到过,在spring security的加载过程中会调用到WebSecurityConfigurerAdaptergetHttp()方法,我们在这里还是把这个方法的源代码贴出来

    return http;
        }

        DefaultAuthenticationEventPublisher eventPublisher = objectPostProcessor
                .postProcess(new DefaultAuthenticationEventPublisher());
        localConfigureAuthenticationBldr.authenticationEventPublisher(eventPublisher);

        AuthenticationManager authenticationManager = authenticationManager();
        authenticationBuilder.parentAuthenticationManager(authenticationManager);
        Map, Object> sharedObjects = createSharedObjects();

        http = new HttpSecurity(objectPostProcessor, authenticationBuilder,
                sharedObjects);

        if (!disableDefaults) {
            // @formatter:off
            http
                .csrf().and()
                .addFilter(new WebAsyncManagerIntegrationFilter())
                .exceptionHandling().and()
                .headers().and()
                .sessionManagement().and()
                .securityContext().and()
                .requestCache().and()
                .anonymous().and()
                .servletApi().and()
                .apply(new DefaultLoginPageConfigurer<>()).and()
                .logout();
            // @formatter:on
            ClassLoader classLoader = this.context.getClassLoader();
            List defaultHttpConfigurers =
                    SpringFactoriesLoader.loadFactories(AbstractHttpConfigurer.class, classLoader);

            for(AbstractHttpConfigurer configurer : defaultHttpConfigurers) {
                http.apply(configurer);
            }
        }
    //??configure??
        configure(http);
        return http;
    }
  • 这个方法在前面有写过注释,这里不再赘述,我们看到下面的这段代码
if (!disableDefaults) {
            // @formatter:off
            http
                .csrf().and()
                .addFilter(new WebAsyncManagerIntegrationFilter())
                .exceptionHandling().and()
                .headers().and()
                .sessionManagement().and()
                .securityContext().and()
                .requestCache().and()
                .anonymous().and()
                .servletApi().and()
                .apply(new DefaultLoginPageConfigurer<>()).and()
                .logout();
            // @formatter:on
            ClassLoader classLoader = this.context.getClassLoader();
            List defaultHttpConfigurers =
                    SpringFactoriesLoader.loadFactories(AbstractHttpConfigurer.class, classLoader);

            for(AbstractHttpConfigurer configurer : defaultHttpConfigurers) {
                http.apply(configurer);
            }
        }

如果没有禁止掉默认配置的话HttpSecurity会进行一下默认配置

http
.csrf().and()
.addFilter(new WebAsyncManagerIntegrationFilter())
.exceptionHandling().and()
.headers().and()
.sessionManagement().and()
.securityContext().and()
.requestCache().and()
.anonymous().and()
.servletApi().and()
.apply(new DefaultLoginPageConfigurer<>()).and()
.logout();

我们把这个叫做代码块1
我们下面具体讲过滤器,然后再说是哪一句代码才有的过滤器

2.过滤器列表概述

按照执行顺序

2.1 第一个过滤器 WebAsyncManagerIntegrationFilter

  • 默认加载配置,请看下图


    Spring Security原理篇(五) 默认过滤器_第2张图片
  • 过滤器作用
    从类的注释上我们就可以知道,先看一下注释
/**
 * Provides integration between the {@link SecurityContext} and Spring Web's
 * {@link WebAsyncManager} by using the
 * {@link SecurityContextCallableProcessingInterceptor#beforeConcurrentHandling(org.springframework.web.context.request.NativeWebRequest, Callable)}
 * to populate the {@link SecurityContext} on the {@link Callable}.
 *
 * @author Rob Winch
 * @see SecurityContextCallableProcessingInterceptor
 */
public final class WebAsyncManagerIntegrationFilter extends OncePerRequestFilter {

简单来说就是提供SecurityContext和spring Web的集成

2.2 第二个过滤器 SecurityContextPersistenceFilter

  • 通过下面的配置加载进来


    Spring Security原理篇(五) 默认过滤器_第3张图片
  • 作用:其实主要是为了加载SecurityContext对象,然后加载到SecurityContextHolder

2.3 第三个过滤器HeaderWriterFilter

  • 默认加载配置
Spring Security原理篇(五) 默认过滤器_第4张图片
image.png
  • 作用:主要是对响应信息的请求头添加一些配置

2.4 第四个过滤器CsrfFilter

  • 默认加载配置
Spring Security原理篇(五) 默认过滤器_第5张图片
image.png
  • 作用:主要防止跨站请求伪造

2.5 第五个过滤器LogoutFilter

  • 默认加载配置
Spring Security原理篇(五) 默认过滤器_第6张图片
image.png
  • 作用:主要是对登出操作的处理

2.6 第六个过滤器UsernamePasswordAuthenticationFilter

  • 默认加载配置


    Spring Security原理篇(五) 默认过滤器_第7张图片
  • 作用:主要是用户名密码登录认证

2.7 第七个过滤器RequestCacheAwareFilter

  • 默认加载配置


    Spring Security原理篇(五) 默认过滤器_第8张图片
    image.png
  • 作用:用于用户登录成功后,重新恢复因为登录被打断的请求

2.8 第八个过滤器SecurityContextHolderAwareRequestFilter

  • 作用:填充ServletRequest

实现servlet API安全方法的包装器

2.9 第九个过滤器AnonymousAuthenticationFilter

  • 默认加载配置


    Spring Security原理篇(五) 默认过滤器_第9张图片
  • 作用:匿名用户信息的填充

2.10 第十个过滤器SessionManagementFilter

  • 默认加载配置


    Spring Security原理篇(五) 默认过滤器_第10张图片
  • 作用:会话的管理机制

2.11 第十一个过滤器ExceptionTranslationFilter

  • 默认加载配置


    Spring Security原理篇(五) 默认过滤器_第11张图片
  • 作用:对于任意的AccessDeniedException类型的异常和AuthenticationException类型异常的处理

3.总结

我们暂时还不具备详细的阅读源码来看这些Filter具体实现的过程。因为我们还要做一些准备工作,当阅读完其他的一些源代码再仔细的回头看每一个Filter,这里只是暂时先做一个预热而已。

你可能感兴趣的:(Spring Security原理篇(五) 默认过滤器)