springsecurity认证流程分析
# springsecurity过滤器链
Spring Security功能的实现主要是由一系列过滤器链相互配合完成。
(1)SecurityContextPersistenceFilter
:这个Filter是整个拦截过程的入口和出口(也就是第一个和最后- 一个拦截器) , 会在请求开始时从配置好的SecurityContextRepository中获取SecurityContext ,然后把它设置给SecurityContextHolder.在请求完成后将SecurityContextHolder持有的SecurityContext再保存到配置好的SecurityContextRepository ,同时清除securityContextHolder所持有的SecurityContext ; .
(2)UsernamePasswordAuthenticationFilter
:用于处理来自表单提交的认证。该表单必须提供对应的用户名和密码,其内部还有登录成功或失败后进行处理的AuthenticationSuccessHandler和AuthenticationFailureHandler ,这些都可以根据需求做相关改变;
(3)FilteSecurityInterceptor
:是用于保护web资源的,使用AccessDecisionManager对当前用户进行授权访问,前面已经详细介绍过了;
(4)ExceptionTranslationFilter
:ExceptionTranslationFilter能够捕获来自FilterChain 所有的异常,并进行处理。但是它只会处理两类异常:ExceptionTranslationFilter能够捕获来自FilterChain 所有的异常,并进行处理。但是它只会处理两类异常:
AuthenticationException和AccessDeniedException ,其它的异常它会继续抛出。
# 入口DelegatingFilterProxy
从DelegatingFilterProxy
的doFilter方法,跟踪到 FilterChainProxy
的doFilter,一共有11个过滤器,再将断点分别打到SecurityContextPersistenceFilter、 UsernamePasswordAuthenticationFilter、ExceptionTranslationFilter、FilterSecurityInterceptor中,看执行逻辑
# 一、用户认证流程
上节中提到Spring Security核心就是一系列的过滤器链,当一个请求来的时候,首先要通过过滤器链的校验,校验通过之后才会访问用户各种信息。
这里要说明的是在过滤器的最前端有一个SecurityContextPersistenceFilter
,当请求进来和返回的时候都会经过这个过滤器,它主要存放用户的认证信息。这里先简单提一下,后面会详解。
当用户发送登录请求的时候,进入到UsernamePasswordAuthenticationFilter
中进行校验。
# 二、认证结果如何在多个请求之间共享
下面我们来看看用户在通过身份校验之后,是如何将认证结果在多个请求中共享的呢?肯定是放入session当中的。先来看看流程图。
# 三、获取认证用户信息
如果我们需要获取用的校验过的所有信息,该如何获取呢?上面我们知道了会将校验结果放入session中,因此,我们可以通过session获取。
@GetMapping("/me")
public Object getMeDetail() {
return SecurityContextHolder.getContext().getAuthentication();
}
@GetMapping("/me1")
public Object getMeDetail(Authentication authentication){
return authentication;
}
在登录成功之后,上面有两种方式来获取,访问上面的请求,就会获取用户全部的校验信息,包括ip地址等信息。
参考文章:
Spring Security认证与授权的原理(源码分析,超详细)_Zystem-CSDN博客 (opens new window)