首页 > 其他分享 >Spring (32)Spring Security的过滤器链

Spring (32)Spring Security的过滤器链

时间:2024-06-02 09:32:06浏览次数:12  
标签:FilterChainProxy chain Spring request SecurityFilterChain 32 过滤器 Security

Spring Security 的安全模型核心之一是一系列过滤器,这些过滤器组成了一个链。这个过滤器链负责处理进入应用的每个HTTP请求,实现认证、授权等安全功能。每个过滤器都有其特定的责任,它们按照特定的顺序执行。

过滤器链概念

在 Spring Security 中,过滤器链是通过 FilterChainProxy 类来管理的。FilterChainProxy 包含多个 SecurityFilterChain 实例,每个 SecurityFilterChain 包含一系列的过滤器。当一个请求到来时,FilterChainProxy 会根据请求的URL决定使用哪一个 SecurityFilterChain,然后依次执行该链中的过滤器。

核心过滤器

Spring Security 中的几个关键过滤器包括:

  • SecurityContextPersistenceFilter: 保持安全上下文(SecurityContext)在请求之间的持久化。通常用于从Session中加载和存储安全上下文。
  • UsernamePasswordAuthenticationFilter: 处理基于表单的登录请求。
  • BasicAuthenticationFilter: 处理基于HTTP基本认证的请求。
  • ExceptionTranslationFilter: 捕获安全异常,包括认证失败和访问被拒绝的异常,并根据配置进行相应处理(如重定向到登录页面)。
  • FilterSecurityInterceptor: 最终的授权决策过滤器,它会在调用目标资源之前检查 AccessDecisionManager 是否允许当前用户访问请求的资源。

示例配置

在 Spring Boot 应用中,可以通过继承 WebSecurityConfigurerAdapter 并重写 configure(HttpSecurity) 方法来自定义安全配置,包括过滤器链的配置。以下是一个简单的示例,它演示了如何自定义哪些路径受保护,哪些不受保护:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll() // 允许所有人访问"/"和"/home"
                .anyRequest().authenticated() // 除了上面定义的URL外,所有请求都需要认证
            .and()
            .formLogin() // 启用表单登录
                .loginPage("/login") // 自定义登录页面URL
                .permitAll() // 允许所有人访问登录页面
            .and()
            .logout() // 启用注销
                .permitAll(); // 允许所有人访问注销页面
    }
}

深入源码

在源码中,FilterChainProxy 是整个过滤器链的入口点。它被定义为一个Servlet过滤器,负责委托给配置的 SecurityFilterChainFilterChainProxy 的初始化过程中会加载 SecurityConfig 中定义的过滤器和相关配置。

public class FilterChainProxy extends GenericFilterBean {

    private List<SecurityFilterChain> filterChains;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 根据请求找到对应的SecurityFilterChain
        SecurityFilterChain secChain = getSecurityFilterChain(request);
        if (secChain != null) {
            secChain.doFilter(request, response, chain);
        } else {
            // 如果没有找到匹配的FilterChain,继续执行Servlet容器默认的Filter链
            chain.doFilter(request, response);
        }
    }

    private SecurityFilterChain getSecurityFilterChain(ServletRequest request) {
        for (SecurityFilterChain chain : filterChains) {
            if (chain.matches(request)) {
                return chain;
            }
        }
        return null;
    }
}

SecurityFilterChaindoFilter 方法会依次调用链中的每个过滤器。每个过滤器执行完毕后,一般会调用 FilterChaindoFilter 方法,将控制权传递给链中的下一个过滤器,直到所有过滤器执行完毕。

这里的源码只是一个简化的视角,实际的实现可能会更复杂,因为涉及到的类和接口较多,但基本原理和流程是一致的。通过上述分析,你应该能够获得对 Spring Security 过滤器链如何工作的深入理解。

标签:FilterChainProxy,chain,Spring,request,SecurityFilterChain,32,过滤器,Security
From: https://blog.csdn.net/qq_43012298/article/details/136940874

相关文章

  • Spring Boot整合PageHelper
    文章目录概念前置内容SpringBoot整合PageHelper参考来源概念PageHelper是Mybatis的分页插件前置内容SpringBoot快速整合SpringMVC和Mybatis-Plus,实现基本的增删改查功能SpringBoot整合PageHelper引入maven依赖<!--PageHelper--><dependency>......
  • AI编程新手快速体验SpringCloud Alibaba 集成AI功能
    上周六写了一篇文章  震撼发布!SpringAI框架重磅上线,Java集成AI轻松搞定!   部分同学可能没有科学上网的条件,本地ollama集成又比较笨重。趁着周六,写一篇基于SpringCloudAlibaba集成AI的文章。先简单介绍下SpringCloudAlibabaAI。SpringCloudAlibabaAI基......
  • 免费分享一套微信小程序图书借阅(图书管理)系统(SpringBoot后端)
    大家好,我是java1234_小锋老师,看到一个不错的微信小程序图书借阅(图书管理)系统(,分享下哈。项目介绍该项目是一套图书馆信息管理系统,包括用户小程序以及后台管理系统,基于SpringBoot+MyBatis实现。前台商城系统包含用户注册登录、首页门户、图书查询、在线借阅、个人中心、我......
  • 基于标准库的STM32的外部中断EXTI
            毕设已经告一段落了,接下来准备开始整理一下毕设中用到的知识与技术细节,今天整理的是STM32从编码器获取数据的方式-----外部中断(EXTI):外部中断分为四个硬件相关外设,GPIO/AFIO/EXTI/NVIC(EXTI/NVIC不需要开启时钟)1.RCC开启时钟RCC_APB2PeriphClockCmd(RCC_APB2P......
  • 基于FREERTOS的STM32多功能手表(软件设计)
    目录前言程序现象 项目背景项目介绍目前版本实现的功能设计到的freertos知识使用到的硬件硬件连线图实现思路任务调度流程图​编辑 任务具体操作导图      代码讲解freertos初始化按键中断回调函数显示时间任务显示菜单任务其它任务(ShowCalenda......
  • Java项目:springBoot汽车销售管理系统(计算机毕业设计)
    作者主页:Java毕设网 简介:Java领域优质创作者、Java项目、学习资料、技术互助文末获取源码一、项目介绍本项目基于springboot以及Vue开发,为前后端分离的项目。针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能,提供经理和销售两种角色进行管......
  • 基于MBD的电机控制算法开发-STM32
    使用simulink搭建V/F电机控制框架,并集成到STM32F4中1.Simulink模型搭建本例子使用V/F拖动启动方法控制永磁同步电机启动,simulink模型其中V/F启动部分输出d,q轴的期望电压,并通过SVPWM调制算法施加到电机的三相:模型的输入为空,模型输出为为三路PWM波的占空比。function[ud_out,u......
  • 初学者springboot启动报错Caused by: java.lang.IllegalArgumentException: Invalid v
    本人第一次接触springboot框架本来想用mybatis连接数据库,引入mybatisplus配置就启动报错packagecom.hu.springboot_mybatis.dao;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.hu.springboot_mybatis.pojo.UserPojo;importorg.apache.ibatis.ann......
  • Springboot 开发 -- 统一异常处理最佳实践
    引言在企业级应用开发中,异常处理是保障系统稳定性和可维护性的关键环节。SpringBoot提供了一系列优雅的异常处理机制,帮助开发者更高效地管理和响应异常情况。本文将总结SpringBoot中异常处理的最佳实践。一、异常处理原则在进行异常处理之前,需要明确几个基本的处理......
  • h32 Most commonly used tags in HTML
     MostcommonlyusedtagsinHTMLLastUpdated:08Mar,2024 MostcommonlyusedtagsinHTMLrefertoHTMLelementsfrequentlyutilizedforstructuringwebcontent.Theseinclude<div>fordivision,<p>forparagraphs,<a>......