Spring Security过滤器链加载执行流程源码解析

yizhihongxing

针对Spring Security过滤器链加载执行流程源码解析的完整攻略,我把它分为以下几个部分:

  1. 概述
  2. Spring Security过滤器链的加载流程
  3. Spring Security过滤器链的执行流程
  4. 示例1:启动时访问静态资源
  5. 示例2:访问受保护资源

下面对每个部分进行详细讲解。

1. 概述

Spring Security是一个基于Spring框架的安全框架,提供了身份认证、授权和其他安全功能。Spring Security的核心概念是过滤器链,在过滤器链中会执行多个SecurityFilterChain,每个SecurityFilterChain由一些过滤器组成,过滤器会逐一进行处理。在本篇攻略中,我们将深入分析Spring Security过滤器链的加载流程和执行流程。

2. Spring Security过滤器链的加载流程

Spring Security的过滤器链加载流程如下:

  1. 在WebSecurityConfigurerAdapter中,我们可以通过调用configure(HttpSecurity http)方法来配置过滤器链。在这个方法中,我们可以通过http.authorizeRequests().xxx()等方法来进行配置。
  2. 在configure(HttpSecurity http)方法中,会调用WebSecurity.applyDefaultConfiguration()方法来应用默认配置。这个方法会加载默认的过滤器链。默认过滤器链中有以下几个SecurityFilterChain:
    • SecurityContextHolderAwareRequestFilter:将SecurityContextPersistenceFilter添加到链的头部
    • UsernamePasswordAuthenticationFilter:身份认证过滤器
    • DefaultLoginPageGeneratingFilter:生成默认登录页面过滤器
    • CasAuthenticationFilter:CAS身份认证过滤器
    • ConcurrentSessionFilter:处理并发会话过滤器
    • RequestCacheAwareFilter:请求缓存过滤器
    • SecurityContextPersistenceFilter:安全上下文持久化过滤器
    • LogoutFilter:登出过滤器
    • BasicAuthenticationFilter:基本身份认证过滤器
    • RememberMeAuthenticationFilter:记住我身份认证过滤器
    • AnonymousAuthenticationFilter:匿名身份认证过滤器
  3. 在调用WebSecurity.applyDefaultConfiguration()方法后,会继续调用其他configure()方法来加载自定义的过滤器链。我们可以通过这些方法来添加新的SecurityFilterChain。
  4. 最后,Spring Security会加载所有SecurityFilterChain,并将它们保存在WebSecurity中。

3. Spring Security过滤器链的执行流程

Spring Security的过滤器链执行流程如下:

  1. 当有一个请求到达服务器,会先经过前置过滤器,这些前置过滤器并不属于Spring Security的过滤器链。
  2. 当请求到达Spring Security的过滤器链后,会按照SecurityFilterChain中定义的顺序进行处理。
  3. 在SecurityFilterChain中,每个过滤器中的doFilter()方法会被逐一调用。
  4. 如果某个过滤器中调用了chain.doFilter()方法,则会顺序执行下一个过滤器。
  5. 如果某个过滤器中已经处理完了请求,就会返回到上一个过滤器,逐级向前返回,直到返回到前置过滤器。

4. 示例1:启动时访问静态资源

下面给出一个示例,来说明Spring Security过滤器链加载和执行的流程。

我们在WebSecurityConfigurerAdapter中添加以下配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    //配置访问静态资源不要拦截
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/static/**");
    }

}

这个配置添加了一个忽略/static/**路径的WebSecurity配置,在加载配置的时候就会加载WebSecurityConfigurerAdapter实例,然后调用configure(WebSecurity web)方法,将忽略的路径加载到WebSecurity里面。

当访问/static/路径下的资源时,请求会经过所有前置过滤器后,到达Spring Security的过滤器链中。在SecurityFilterChain中,会先执行SecurityContextHolderAwareRequestFilter过滤器,然后执行UsernamePasswordAuthenticationFilter过滤器等其他过滤器。

由于/configure(WebSecurity web)方法中的配置,当请求到达SecurityContextHolderAwareRequestFilter过滤器时,会直接返回,不再进行后续的过滤器处理。

5. 示例2:访问受保护资源

我们在定义一个受保护的资源时,需要在configure(HttpSecurity http)方法中添加以下配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    //配置受保护资源
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .permitAll();
    }

}

在上面的配置中,我们定义了一个/login路径的登录页面,除此之外,其他资源都是受保护的。在加载配置的时候,会加载WebSecurityConfigurerAdapter实例,然后调用configure(HttpSecurity http)方法进行配置。在这个方法中,我们可以通过http.authorizeRequests().xxx()等方法来进行配置。

当访问受保护的资源时,请求会经过所有前置过滤器后,到达Spring Security的过滤器链中。在SecurityFilterChain中,会先执行SecurityContextHolderAwareRequestFilter过滤器,然后执行UsernamePasswordAuthenticationFilter过滤器等其他过滤器。

当到达UsernamePasswordAuthenticationFilter过滤器时,Spring Security会检查用户是否已经登录,如果未登录,就会跳转到配置的/login路径的登录页面,等用户输入用户名和密码后,再进行登录操作。

在登录成功后,请求会再次经过前置过滤器,进入Spring Security的过滤器链。此时,请求会顺序经过所有过滤器处理,最后到达被受保护的资源。如果请求被允许访问,就会返回请求结果,否则返回拒绝访问的结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security过滤器链加载执行流程源码解析 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java利用数组求平均值,最大值,最小值

    求平均值、最大值、最小值常常是我们在处理数据时需要进行的一些基本操作。针对这个问题,我们可以利用Java中的数组进行解决。 求平均值 对于一个数组,我们可以通过遍历每一个元素,将它们加起来,然后再除以数组的长度,就可以得到这个数组的平均值。 // 定义数组 int[] arr = {1, 2, 3, 4, 5}; // 统计总和 int sum = 0; f…

    Java 2023年5月26日
    00
  • Java web实现头像上传以及读取显示

    下面我将为您详细讲解如何使用Java web实现头像上传以及读取显示的完整攻略。 1. 准备工作 在开始实现之前,需要确保您已经有如下几个基本的环境: 开发环境:Eclipse或者IntelliJ IDEA 服务器环境:Tomcat 数据库:MySQL 同时,需要引入如下两个库: commons-fileupload-1.3.1.jar commons-io…

    Java 2023年5月20日
    00
  • 如何使用​win10内置的linux系统启动spring-boot项目

    下面是如何使用Win10内置的Linux系统启动spring-boot项目的完整攻略。 安装WSL WSL(Windows Subsystem for Linux)是Win10内置的Linux子系统,可在其上运行各种Linux发行版。要使用WSL启动spring-boot项目,首先需要安装WSL: 打开”控制面板”,进入”程序与功能”,选择左侧的”启用或关闭…

    Java 2023年5月19日
    00
  • 基于重定向RedirectAttributes的用法解析

    基于重定向 RedirectAttributes 的用法解析 在 Spring MVC 中,经常会使用重定向来实现一些跳转的功能。而 RedirectAttributes 则是在使用重定向时用于向跳转页面传递数据的对象。 RedirectAttributes 的用法 使用 RedirectAttributes 一般需要按以下步骤进行: 在处理请求的方法中通过…

    Java 2023年6月15日
    00
  • kafka分布式消息系统基本架构及功能详解

    Kafka分布式消息系统基本架构及功能详解 Kafka简介 Kafka是一个高性能、可扩展、分布式的消息处理平台。它最初是由Linkedin公司开发的,现在已经成为Apache顶级项目之一。Kafka主要用于消息的发布和订阅过程中的分布式处理,可以处理每秒数百万条消息,非常适合使用在大数据处理、实时流处理、日志收集、用户活动跟踪等场景。 Kafka基本架构 …

    Java 2023年5月20日
    00
  • Java的Struts框架报错“ActionMappingException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“InvalidTokenException”错误。这个错误通常由以下原因之一起: 令牌无效:如果令牌无,则可能会出现此错误。在这种情况下,需要检查令牌是否有效以解决此问题。 配置错误:如果配置文件中正确配置,则可能会现此错误。在这种情况下,检查文件以解决此问题。 以下是两个实例: 例 1 如果令牌无效,则可以尝…

    Java 2023年5月5日
    00
  • Java中Map与JSON数据之间的互相转化

    Java中Map与JSON数据之间的转化是Java开发中常见的操作,特别是在进行前后端数据交互的过程中。下面是Java中Map与JSON数据之间互相转化的完整攻略。 1. Map转JSON 将Map转化为JSON格式的数据可以使用Gson、Jackson等第三方库进行实现。 1.1 Gson实现 Gson是Google提供的一个Java中的JSON处理库,可…

    Java 2023年5月26日
    00
  • 优化spring boot应用后6s内启动内存减半

    优化 Spring Boot 应用可以显著降低应用启动进程所需的时间,同时减少内存占用,提高应用的性能。下面是优化 Spring Boot 应用的完整攻略: 1. 去除无用依赖 在应用启动过程中,Spring Boot 会扫描所有的依赖并生成一个应用的依赖关系树。因此,需要仅仅保留应用的所需依赖,去除无用依赖,减小应用的依赖树,加速应用的启动时间。 可以通过…

    Java 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部