Web应用中的 Spring Security 要点笔记

在一个使用了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

你可能感兴趣的:(Java,architecture,Spring,Web,Spring,Boot)