Web应用中的 Spring Security 要点笔记

本文详细介绍了Spring Security中Filter机制的工作原理,包括Filter的注册、排序及FilterChainProxy的内部结构。阐述了如何通过FilterChainProxy管理多个Filter链,并解释了DelegatingFilterProxy与FilterChainProxy之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个使用了Spring Security 的 Web 应用中,安全目标的达成基于 Servlet规范的Filter机制 :

  • 客户端对应用发起请求,容器基于请求URI决定应用哪个servlet和哪些filters
  • 每个请求最多由某一个servlet处理 ;
  • 所有要应用的filter按照特定顺序形成一个链;
    • Filter顺序的决定
      • Filter bean定义通过使用注解@Order或者实现接口Ordered
      • FilterRegistrationBean API 本身有顺序属性;
  • 链中的某个filter如果想自己处理请求,甚至可以否决链的其他部分;
  • 某个filter可以修改请求/响应对象;

Web容器角度,整个Spring Security安全机制是封装为一个Filter存在的,而不是多个Filter

  • 该安全filter的实现类为FilterChainProxy;
  • 该安全filter是一个以bean的形式缺省被安装;
  • Web容器角度看,FilterChainProxy是一个filter,但其内部是一个filter chain,有多个filter;
  • 实际上在FilterChainProxy之上还有一层DelegatingFilterProxy
    • DelegatingFilterProxy不一定是一个 bean,FilterChainProxy总是一个bean;
    • DelegatingFilterProxy把实际工作交给FilterChainProxy来做;
  • FilterChainProxy的名字总是叫做springSecurityFilterChain;
  • FilterChainProxy包含了所有的安全逻辑,内部组织为一个filter chain;
    • 所有这些内部的安全filter也都实现了Servlet规范中标准的Filter接口;
  • FilterChainProxy可以管理多个filter chain,这些对容器是透明的;
  • FilterChainProxy发请求派发给第一个匹配的filter chain来处理;

一个使用了Spring SecuritySpring Boot Web应用,其FilterChainProxy filter中通常会有包含若干个filter chain,这里我们假定有n个 :

  • n-1filter chain通常用来忽略静态资源,比如分别对应/css/**,/images/**,error view /error等;
  • 最后一个用来匹配/**,其中包含了认证,授权,异常处理,会话处理,头部写入等等主要安全逻辑。
    • 缺省情况下这个filter chain包含多个filter,一般情况下用户不需要关注它们是什么,什么时候用。

Spring Boot Web应用中,FilterChainProxy bean由安全配置类WebSecurityConfiguration创建 :

  • 整个应用对应一个 WebSecurity 实例,代表整个应用所有的Web安全配置;
  • WebSecurity 实例 对应多个 WebSecurityConfigurer 实例 ;
    • 每个WebSecurityConfigurer 实例对应一个HttpSecurity实例;
  • WebSecurityConfiguration 使用上面的 WebSecurity 创建bean FilterChainProxy springSecurityFilterChain;
    • WebSecurity::build() 创建并返回了类型为 FilterChainProxy 对象;
    • 每个 WebSecurityConfigurer 实例对应生成 FilterChainProxy中的一个filter chain;
    • 每个web.ignoring().antMatchers()调用对应生成 FilterChainProxy中的一个filter chain;

官方参考资料:Spring Security Architecture

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值