Spring Security 过滤器注册脉络梳理

Spring Security 是 Spring 框架的子项目,专门用于处理认证与授权相关的安全问题。在 Spring Security 的实现过程中,过滤器是一个核心概念,所有认证和授权都是通过过滤器实现的。因此,了解 Spring Security 过滤器的注册脉络对于学习 Spring Security 至关重要。

Spring Security 过滤器概述

Spring Security 中最重要的过滤器是 FilterChainProxy 过滤器。它是整个 Spring Security 过滤器链的入口点,所有的请求都要经过它。FilterChainProxy 本身不负责认证或授权,它只是委托给下游的过滤器进行处理。下游的过滤器处理请求时,往往需要判断当前用户是否已经认证和授权,并根据判断结果进行响应处理。

FilterChainProxy 过滤器内部维护一个过滤器列表,每个过滤器都被封装成一个 SecurityFilterChain 对象,表示一组过滤器链。同一个 URL 可能会被多个 SecurityFilterChain 匹配,因此 FilterChainProxy 需要依次遍历所有匹配的 SecurityFilterChain,找到第一个能够处理该请求的 SecurityFilterChain,并将其委托给该 SecurityFilterChain 中的第一个过滤器进行处理。如果所有匹配的 SecurityFilterChain 都不能处理该请求,FilterChainProxy 会返回 404 错误。

Spring Security 过滤器链注册

Spring Security 的过滤器链是由多个过滤器组成的。一般情况下,我们不需要手动注册每个过滤器,只需要注册 FilterChainProxy 过滤器即可,因为它会自动加载所有的过滤器。但是,如果我们需要自定义一些过滤器,或者修改过滤器的执行顺序,就需要手动注册过滤器。

Spring Security 中过滤器链的注册是通过实现 WebSecurityConfigurer 接口来实现的,在该接口的 configure 方法中,我们可以通过 HttpSecurity 对象来配置请求的安全性和授权,也可以通过 HttpSecurity 对象来注册过滤器链。

下面是一个简单的示例,演示如何自定义一个过滤器并将其添加到 Spring Security 过滤器链中,以实现处理 RESTFUL API 后缀 .json 的认证和授权功能:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/api/**.json").authenticated()
                .anyRequest().permitAll()    
            .and()
            .addFilterBefore(new JsonAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    }

}

上面的配置中,我们将所有 /api/xxx.json 结尾的请求设置为需要认证和授权的请求,同时添加了一个自定义的 JsonAuthenticationFilter 过滤器,它会在 UsernamePasswordAuthenticationFilter 过滤器之前执行。

Spring Security 过滤器的执行顺序

Spring Security 中的过滤器由多个过滤器组成,它们的执行顺序是非常重要的。一般来说,Spring Security 中的过滤器执行顺序如下:

  1. WebAsyncManagerIntegrationFilter:用来将 SecurityContext 中的 SecurityContextHolder 适配到 WebAsyncManager 中,以支持 Spring MVC 的异步处理。
  2. SecurityContextPersistenceFilter:从 HttpSession 中获取已有的 SecurityContext 对象,存入到线程安全的 SecurityContextHolder 中。如果 HttpSession 中没有 SecurityContext 对象,则创建一个新的空对象存入。
  3. HeaderWriterFilter:用来添加一些安全相关的 HTTP Header。
  4. CsrfFilter:用来处理 CSRF(跨站请求伪造)攻击。
  5. UsernamePasswordAuthenticationFilter:用来处理用户名密码认证。
  6. RequestCacheAwareFilter:用来处理缓存当前请求。
  7. SecurityContextHolderAwareRequestFilter:用来获取绑定在 SecurityContextHolder 中的 SecurityContext 信息,并将其设置到 HttpServletRequest 中,以便请求线程中的其他组件可以使用。
  8. AnonymousAuthenticationFilter:用来处理匿名用户的认证。
  9. SessionManagementFilter:用来管理 Session,包括创建、销毁、更新 Session 等操作。
  10. ExceptionTranslationFilter:用来处理异常。
  11. FilterSecurityInterceptor:最后一个过滤器,用来进行授权。

我们也可以手动调整过滤器的执行顺序,以满足我们自己的需求。通过下面的示例,我们可以看到如何调整过滤器的执行顺序,这里将 CsrfFilter 过滤器移动到了 UsernamePasswordAuthenticationFilter 过滤器之后:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeRequests()
                .antMatchers("/api/**.json").authenticated()
                .anyRequest().permitAll()    
            .and()
            .addFilterAfter(new JsonAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
            .addFilterAfter(new CsrfFilter(), JsonAuthenticationFilter.class);
    }
}

上面的配置中,我们先禁用了 CsrfFilter 过滤器,然后在配置文件中添加了一个新的 JsonAuthenticationFilter 过滤器,将它加到了 UsernamePasswordAuthenticationFilter 过滤器之后,最后将 CsrfFilter 过滤器加到了 JsonAuthenticationFilter 过滤器之后。这样,我们就改变了过滤器的执行顺序,先执行了 JsonAuthenticationFilter 过滤器,然后才执行了 CsrfFilter 过滤器。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security 过滤器注册脉络梳理 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Spring Boot 整合持久层之Spring Data JPA

    下面是对Spring Boot整合持久层之Spring Data JPA的一个完整攻略。 什么是Spring Data JPA Spring Data JPA是Spring提供的一个基于JPA(Java Persistence API)规范的框架,它提供了一种简化的方式来操作数据存储,不管是关系型数据库还是非关系型数据库。 如何使用Spring Data J…

    Java 2023年6月2日
    00
  • Hibernate连接三种数据库的配置文件

    下面是针对Hibernate连接三种数据库的配置文件的完整攻略,包括MySQL、Oracle和SQL Server。本攻略为你提供了每种数据库的示例代码。 准备工作 在开始配置之前,需要先准备好以下工具和环境: 工具: Hibernate, JDBC 驱动程序 环境: Java, 数据库,数据库服务器 MySQL 配置文件 这是一个连接MySQL数据库的Hi…

    Java 2023年5月20日
    00
  • 常见的 JVM 性能分析工具有哪些?

    以下是关于常见的 JVM 性能分析工具的完整使用攻略: 常见的 JVM 性能分析工具 JVM 性能分析工具是用来分析 Java 程序在 JVM 上的性能表现的工具。常见的 JVM 性能分析工具包括以下几种: 1. JConsole JConsole 是 JDK 自带的一款监控工具,可以监控 JVM 的内存、线程、类、CPU 等信息。通过 JConsole,可…

    Java 2023年5月12日
    00
  • Spring Session的使用示例

    下面我将为您详细讲解关于“Spring Session的使用示例”的完整攻略,包括设置和使用: 设置 1. 添加依赖 首先需要在pom.xml文件中添加spring-session的依赖: <dependency> <groupId>org.springframework.session</groupId> <art…

    Java 2023年5月26日
    00
  • js对table的td进行相同内容合并示例详解

    下面是“js对table的td进行相同内容合并示例详解”的完整攻略: 1. 方案简介 在Web开发中,我们可以使用JavaScript操作HTML中的DOM元素,进而实现对table的td进行相同内容合并的功能。具体的实现思路是找到table中具有相同文本内容的td单元格,如果它们在同一行或同一列,则进行合并,从而达到优化表格展示的效果。 2. 示例1:按行…

    Java 2023年6月16日
    00
  • spring boot 2.x静态资源会被拦截器拦截的原因分析及解决

    在Spring Boot 2.x版本中,静态资源默认会被拦截器拦截,这是因为Spring Boot引入了WebMvcConfigurerAdapter类,该类覆盖了addResourceHandlers方法,将/**路径下的所有请求都拦截了,并尝试寻找相应的静态资源。 要解决这个问题,需要在自己的项目中进行一些配置。 首先,在项目的配置文件applicati…

    Java 2023年6月3日
    00
  • Java 实战练习之网上电商项目的实现

    Java 实战练习之网上电商项目的实现攻略 准备工作 确保已安装JDK,建议使用JDK8以上版本。 确保已安装Maven,用于依赖管理和项目构建。 确认使用的开发工具,如:Eclipse、Intellij IDEA等。 在Github 上创建一个项目并关联到本地。 技术选型 后端框架:Spring Boot 数据库:MySQL ORM框架:MyBatis 前…

    Java 2023年5月18日
    00
  • springboot的war和jar包的使用详解

    Spring Boot的WAR和JAR包使用详解 Spring Boot是一个非常流行的开源框架,可以帮助开发者快速建立基于Spring的应用程序。一般情况下,Spring Boot提供两种打包方式:JAR包和WAR包。本文将详细介绍这两种打包方式的使用方法。 JAR包 JAR包是最常见的Java应用程序打包方式,可以包含所有需要的类文件和资源文件,还可以包…

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