Spring Security 源码分析
1.Spring Security基本执行流程分析:
现在假设我们要发送一个新的请求给我们的项目,默认我们的项目已经配置了Spring Security
这个请求会先进入
1.UsernamePasswordAuthenticationFilter: 验证我们的请求中是否有这个过滤器所需要的信息,比如说账号密码
如果说带了账号密码,那将会尝试使用这些参数进行登录,如果没有带这个过滤器所需要的参数,那就往下走,进入BasicAuthenticationFilter
2.BasicAuthenticationFilter: 判断请求头是否有过滤器所需要的Basic信息,如果有就拿来做Base64解码,取出用户名密码来尝试登录接下去也会走其他的认证方式请求,以此类推
3.FilterSecurityInterceptor: 这个过滤器是整个Security过滤器链的最后的守门人,在他身后就是我们自己写的请求了,那么他什么时候会触发呢? 比如我们在WebSecurityConfigurerAdapter的实现中配置了任何请求都需要身份校验的话,那么FilterSecurityInterceptor就会直接判断用户是否已经走了前边身份认证的过滤器并且完成了认证
其实FilterSecurityInterceptor就是根据我们在WebSecurityConfigurerAdapter中写的配置来进行最终拦截
4.ExceptionTranslationFilter: 用于捕获FilterSecurityInterceptor抛出的异常,比如我们的WebSecurityConfigurerAdapter中配置了所有请求都必须经过身份认证,但是这个时候身份认证出现问题,FilterSecurityInterceptor抛出异常,此时ExceptionTranslationFilter捕获该异常后进行处理,比如引导用户进行身份认证等操作。
认知易错点(必须看):
(但是我们必须要知道的是:ExceptionTranslationFilter这个类的执行流程在FilterSecurityInterceptor之前,请求是先进入到ExceptionTranslationFilter才进FilterSecurityInterceptor,只不过是如果FilterSecurityInterceptor发生了异常会被ExceptionTranslationFilter捕获而已),一会在源码分析中会讲 !
2.Spring Security 基本执行流程源码分析:
还是这一张图的流程,但我们从后往前看代码,先从FilterSecurityInterceptor中看起:
1.FilterSecurityInterceptor
重点关注这一行代码:
InterceptorStatusToken token = super.beforeInvocation(fi);
2.ExceptionTranslationFilter:
现在先来揭晓我们刚刚的疑惑,为什么ExceptionTranslationFilter的执行流程在FilterSecurityInterceptor的前面,下面来分析源码
在这里我们不难看出,进入ExceptionTranslationFilter之后,它会直接执行下一个过滤器的代码,也就是:
FilterSecurityInterceptor,但是如果FilterSecurityInterceptor中的代码执行出现了异常便会直接回到ExceptionTranslationFilter的catch代码块,进行对应的操作 !
3.UsernamePasswordAuthenticationFilter:
讲完了最后面的两个过滤器,现在来看一下UsernamePasswordAuthenticationFilter中做了一些什么?
UsernamePasswordAuthenticationFilter只会执行/login 并且为post的请求
这个请求进来以后会执行
先从请求中获取用户名和密码,然后接下去就是一个登录操作了 !
4.BasicAuthenticationFilter:
在这里我们重点关注这行代码:
UsernamePasswordAuthenticationToken authRequest = authenticationConverter.convert(request);
这一步是从请求头中取出Authorization信息并转成UsernamePasswordAuthenticationToken对象,
接下去便是执行一系列的认证步骤
最后:
我们目前分析的只是Spring Security最核心的一些过滤器,其实Spring Security还有很多很多的过滤器,有兴趣的伙伴们可以再找资料研究 ~