Web应用中的 Spring Security 要点

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

  • 客户端对应用发起请求,容器基于请求URI决定应用哪个servlet和哪些filters
  • 每个请求最多由某一个servlet处理;
  • 所有要应用的filter按照特定顺序形成一个链;
    • Filter顺序的决定
      • Filter bean定义通过使用注解@Order或者实现接口Ordered
      • FilterRegistrationBean API 本身有顺序属性;
  • 链中的某个filter如果想自己处理请求,甚至可以否决链的其他部分;
  • 某个filter可以修改请求/响应对象;
  • 整个Spring Security安全机制是作为一个Filter存在的,实现类为FilterChainProxy
    • Spring Boot应用中该安全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 Security的普通Spring Boot应用,如果没有自定义的安全配置,其FilterChainProxy中通常会有若干个filter chain,这里我们假定有n个 :
* 前n-1filter chain通常用来忽略静态资源,比如/css/**,/images/**,error view /error等。
* 最后一个用来匹配/**,其中包含了认证,授权,异常处理,会话处理,头部写入等等主要安全逻辑。
* 缺省情况下这个filter chian包含多个filter,一般情况下用户不需要关注它们是什么,什么时候用

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

官方参考资料:Spring Security Architecture

猜你喜欢

转载自blog.csdn.net/andy_zhang2007/article/details/81289664