Spring Security 是一个提供身份验证、授权和针对常见攻击的保护的框架。凭借对命令式和反应式应用程序的一流支持,它是保护基于 Spring 的应用程序的事实上的标准。

Spring Security 是在Apache 2.0 许可下发布的开源软件。

Spring Security 5.5 提供了许多新功能,详细内容见官方文档。

SpringSecurity工作原理介绍(一下内容,为个人源码解析总结,可能不准确或者不完整)

SpringSecurity 采用的是责任链的设计模式,它有一条很长的过滤器链。意思就是说从请求一开始,你的请求就会被该过滤链拦截,一层一层的过滤处理,从而实现功能需求。

SpringSecurity提供的过滤链有什么大约10多个,但是并不是每个过滤器都会被执行(可以根据需求来取舍过滤器),下面简单的介绍几个重要的过滤器,后面在实战搭建中能接触到的:

spring security 级别 spring security 5.5_spring security 级别

当然了我这边过滤器有取舍,比如UsernamePasswordAuthenticationFilter,因为我这边自定义实现了基于JWT的认证。上图,可以先表达下过滤链的概念, 是有过滤器组成的链,通过


filterChain.doFilter(request, response);


来调用下一个过滤器,直到结束。

  1. WebAsyncManagerIntegrationFilter:将 Security 上下文与 Spring Web 中用于处理异步请求映射的 WebAsyncManager 进行集成。
  2. SecurityContextPersistenceFilter:在每次请求处理之前将该请求相关的安全上下文信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将SecurityContextHolder 中关于这次请求的信息存储到一个session中,然后将 SecurityContextHolder 中的信息清除。比如 在Session中维护一个用户的安全信息就是这个过滤器处理的。(重点)
  3. HeaderWriterFilter:用于将头信息加入响应中。
  4. CsrfFilter:用于处理跨站请求伪造。
  5. LogoutFilter:用于处理退出登录。
  6.  UsernamePasswordAuthenticationFilter  用于用户登录认证的过滤器,默认设置了拦截/login,获取username ,并通过其从数据库(或者内存,可以自己控制实现)获取用户信息,将获取到密码和传递过来的密码比较进行验证,当然了springSecurity所做的肯定不止这些,我们实战时候详细讲解(重点)
  7. DefaultLoginPageGeneratingFilter:如果没有配置登录页面,那系统初始化时就会配置这个过滤器,并且用于在需要进行登录时生成一个登录表单页面。
  8. BasicAuthenticationFilter:检测和处理 http basic 认证。
  9. RequestCacheAwareFilter:用来处理请求的缓存。 
  10. SecurityContextHolderAwareRequestFilter:主要是包装请求对象request。
  11. AnonymousAuthenticationFilter:检测 SecurityContextHolder 中是否存在 Authentication 对象,如果不存在为其提供一个匿名 Authentication。
  12. SessionManagementFilter:管理 session 的过滤器
  13. ExceptionTranslationFilter:处理 AccessDeniedException 和 AuthenticationException 异常。
  14. FilterSecurityInterceptor:基本上是链中最后调用的,用来用户授权验证(重点)
  15. RememberMeAuthenticationFilter:当用户没有登录而直接访问资源时, 从 cookie 里找出用户的信息, 如果 Spring Security 能够识别出用户提供的remember me cookie, 用户将不必填写用户名和密码, 而是直接登录进入系统,该过滤器默认不开启。

附上一个简单流程图(网上找的图,大致有个概念):

spring security 级别 spring security 5.5_spring security 级别_02


上面简单的做了过滤链的介绍,部分内容也是网上扣过来的,对于重点的我们后面实战+源码+图解。