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

针对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日

相关文章

  • Spring工作原理简单探索

    Spring工作原理简单探索 在了解Spring工作原理之前,需要重新审视一下“控制反转”和“依赖注入”的概念,因为这是Spring框架的核心理念。 控制反转,即IoC(Inversion of Control),指的是一种通过依赖注入的方式来实现对象之间的解耦的设计思想。而依赖注入,即DI(Dependency Injection),指的是一种在对象创建时…

    Java 2023年5月19日
    00
  • SpringBoot应用监控带邮件警报的实现示例

    SpringBoot应用监控带邮件警报是一种常用的应用监控方案,可以在应用发生异常情况时,自动发送邮件提醒开发人员进行处理。下面我将给出一个完整的攻略,包含以下几个步骤: 添加依赖 在SpringBoot项目的pom.xml文件中添加对Spring Boot Actuator和Spring Boot Mail的依赖,以实现监控和发送邮件功能。 <dep…

    Java 2023年5月20日
    00
  • 一文详解Java中字符串的基本操作

    一文详解Java中字符串的基本操作 字符串定义 在Java中,字符串是一种数据类型,用来表示一系列的字符组合。在Java中,字符串是用双引号(” “)括起来的,可以包含任意数量的字符。 String str1 = "hello world"; 字符串拼接 在Java中,字符串可以通过加号(+)进行拼接。 String str1 = &qu…

    Java 2023年5月26日
    00
  • 一篇看懂Java中的Unsafe类

    我来详细讲解一下“一篇看懂Java中的Unsafe类”的攻略。 引言 Java中有一个名为Unsafe的类,这个类是用于开发JDK本身的工具,提供了一些底层操作。通常情况下,我们不应该使用Unsafe类。但是,如果你了解Unsafe类的使用方式,则会对理解JVM底层原理会有所帮助。接下来,我们来详细讲解它的使用方式。 获取Unsafe类实例 在Java中,我…

    Java 2023年5月20日
    00
  • Java Listener监听器使用规范详细介绍

    下面就是「Java Listener监听器使用规范详细介绍」的攻略: 什么是 Java Listener 监听器? Java Listener 监听器是一种设计模式,主要用于处理事件。事件可以是用户在程序中的交互(例如,单击按钮、选择菜单项等),也可以是由程序本身触发的事件(例如,资源加载完成、对象/文件/网络IO操作完成等)。 Java Listener …

    Java 2023年6月15日
    00
  • Java中线程池自定义实现详解

    Java中线程池自定义实现详解 什么是线程池 在Java中,每次创建线程都需要为该线程分配独立的资源,包括CPU利用时间、栈内存等,这些资源的分配和回收都需要时间开销。当并发任务数量较大时,频繁地创建线程会导致系统负担过重,极有可能会出现OOM等问题。为了解决这个问题,Java提供了线程池,它可以在系统初始化时创建一定数量的线程,并将这些线程保存在池中,执行…

    Java 2023年5月19日
    00
  • Spring 代码技巧梳理总结让你爱不释手

    Spring 代码技巧梳理总结让你爱不释手攻略 介绍 Spring是一款开源的,轻量级的Java开发框架。它包含了一系列的工具,使得Java开发更加容易和高效。在本攻略中,我们会总结出一些Spring开发中的常用技巧,以帮助你更加熟悉和熟练地使用Spring。 技巧列表 使用@Autowired简化依赖注入 在Spring中,我们可以使用@Autowired…

    Java 2023年5月19日
    00
  • sql文件怎么打开,SQL格式是什么文件?

    SQL(Structured Query Language)是一种专为管理关系数据库管理系统(RDBMS)而创建的语言。SQL文件是SQL语句的文本文件,由SQL语句组成,通常保存为.sql文件扩展名。 要打开SQL文件,可以使用文本编辑器,也可以使用专门的数据库管理软件(如MySQL Workbench、Navicat等)。在文本编辑器中打开SQL文件,可…

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