Spring Security总体流程、认证流程、鉴权流程浅析

软硬件环境

  • jdk1.8
  • IntelliJIdea
  • SpringBoot2.2.1.RELEASE
  • SpringSecurity5.2.1RELEASE

Spring Security总体流程分析

        SpringSecurity框架的FilterChainProxy$VirtualFilterChain类里面,持有着两大过滤器字段一是SpringSecurity附加的过滤器List<Filter> additionalFilters一是应用本身的过滤器FilterChain originalChain(过滤链里面的过滤器)。SpringSecurity会先过滤其提供的additionalFilters,然后再过滤应用本身的过滤器,总体流程如下图所示:
Spring Security总体流程、认证流程、鉴权流程浅析


认证流程分析

        认证抽象类AbstractAuthenticationProcessingFilter持有private RequestMatcher requiresAuthenticationRequestMatcher,此匹配器决定当前AbstractAuthenticationProcessingFilter类(的实现子类)是否对当前请求进行认证。如果需要认证,那么就进行认证。认证操作,实际是由AuthenticationProvider(接口的实现)完成的。认证抽象类AbstractAuthenticationProcessingFilter持有AuthenticationManager接口对象,该对象(一般由ProviderManager提供实现),ProviderManager持有AuthenticationProvider对象集合。认证时,就是遍历AuthenticationProvider对象集合,只要有一个AuthenticationProvider认证成功了,那么就认证通过,见下图:
Spring Security总体流程、认证流程、鉴权流程浅析

而AuthenticationProvider接口的实现较多,有:
Spring Security总体流程、认证流程、鉴权流程浅析
所以,认证流程,总体上是这样的:
Spring Security总体流程、认证流程、鉴权流程浅析
注:如果需要认证,但是又认证失败的话,会抛出异常。


鉴权流程分析

        鉴权流程相对简单。AbstractSecurityInterceptor抽象类中有一个方法public abstract SecurityMetadataSource obtainSecurityMetadataSource(),其子类需要重写该方法,使其能获得一个SecurityMetadataSource实例,这个实例用来判定当前请求是否需鉴权;AbstractSecurityInterceptor抽象类中有一个字段private AccessDecisionManager accessDecisionManager,其子类需要给这个字段赋一个AccessDecisionManager实例,这个实例用来判定鉴权是否通过(如果需要鉴权的话),见下图:
Spring Security总体流程、认证流程、鉴权流程浅析
如果有多个鉴权过滤器的话:
Spring Security总体流程、认证流程、鉴权流程浅析


Spring Security基础理论梳理完毕 !


^_^ 如有不当之处,欢迎指正

^_^ 参考资料
        《SpringSecurity5.2.1RELEASE源码》

^_^ 本文已经被收录进《程序员成长笔记(六)》,笔者JustryDeng