一、认证处理流程

UsernamePasswordAuthenticationFilter
UsernamePasswordAuthenticationFilter 是用来获取账号和密码,并做简单检验,拼接信息到 UsernamePasswordAuthenticationToken 对象
AuthenticationManager、AuthenticationProvider、UserDetailsService、UserDetails
会根据所得到的 UsernamePasswordAuthenticationToken 对象获取合适的 provider(供应者) 进行检验,然后得到 UserDetails 对象,其中获取 UserDetails 对象 也是通过 UserDetailsService 的 loadUserByUsername 获取的,这里也是我们配置用户名,密码,权限,凭证等。得到 UserDetails 对象后 要经过 预检查,是否可用,是否被锁,是否过期,还要经过一个附加检查,请求加密的密码 和 得到的是否一致,最后是厚检查,检查凭证是否过期。都通过才认为是成功的,返回一个 Authentication 对象。得到对象最后一步就是走 登陆成功处理器 。
二、认证结果如何在多个请求之间共享

默认结果是在session中存放,但什么时候存放的呢?什么时候又从session中读取?
SecurityContextHolder 是 ThreadLoac 的一个封装 。
SecurityContext 是用来存放成功的 Authentication

SecurityContextPersistenceFilter 在所有过滤器之前,再请求时 会先帮我们检查session中是否有 SecurityContext ,如果有就把 SecurityContext 拿出来放到线程里,没有则执行后面的filter。当响应时 检查线程有 SecurityContext ,则放到session里。保证不同的请求同一个session 就可以拿到认证信息。整个请求是在同一个线程,所以我们在 SecurityContextHolder 可以随地拿到用户信息。
三、获取认证用户信息
这里就比较简单了,直接上代码
@GetMapping("/me")
public Object me(){
return SecurityContextHolder.getContext().getAuthentication();
}
@GetMapping("/me1")
public Object me1(Authentication authentication){
return authentication;
}
@GetMapping("/me2")
public Object me2(@AuthenticationPrincipal UserDetails userDetails){
return userDetails;
}
网友评论