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,然后再过滤应用本身的过滤器
,总体流程如下图所示:
认证流程分析:
认证抽象类AbstractAuthenticationProcessingFilter持有private RequestMatcher requiresAuthenticationRequestMatcher,此匹配器决定
当前AbstractAuthenticationProcessingFilter类(的实现子类)是否对当前请求进行认证
。如果需要认证,那么就进行认证。认证操作,实际是由AuthenticationProvider(接口的实现)完成的
。认证抽象类AbstractAuthenticationProcessingFilter持有AuthenticationManager接口对象,该对象(一般由ProviderManager提供实现),ProviderManager持有AuthenticationProvider对象集合。认证时,就是遍历AuthenticationProvider对象集合,只要有一个AuthenticationProvider认证成功了,那么就认证通过,见下图:
而AuthenticationProvider接口的实现较多,有:
所以,认证流程,总体上是这样的:
注:如果需要认证,但是又认证失败的话,会抛出异常。
鉴权流程分析:
鉴权流程相对简单。AbstractSecurityInterceptor抽象类中有一个方法public abstract SecurityMetadataSource obtainSecurityMetadataSource(),其子类需要重写该方法,使其能获得一个SecurityMetadataSource实例
,这个实例用来判定当前请求是否需鉴权
;AbstractSecurityInterceptor抽象类中有一个字段private AccessDecisionManager accessDecisionManager,其子类需要给这个字段赋一个AccessDecisionManager实例
,这个实例用来判定鉴权是否通过(如果需要鉴权的话)
,见下图:
如果有多个鉴权过滤器的话:
Spring Security基础理论梳理完毕 !
^_^ 如有不当之处,欢迎指正
^_^ 参考资料
《SpringSecurity5.2.1RELEASE源码》
^_^ 本文已经被收录进《程序员成长笔记(六)》,笔者JustryDeng