目录
1.认证处理流程说明
表单登录的请求首先会到达UsernamePasswordAuthenticationFilter,在这里面会拿到用户名和密码,然后创建一个重要的对象UsernamePasswordAuthenticationToken,
然后会到达流程图的AuthenticationManager,这里的实现是ProviderManager
然后流程会到AuthenticationProvider,
对于AuthenticationProvider的实现,Security会有这么多个实现的类
不同的认证请求会进行不同的Provider的认证。AbstractUserDetailsAuthenticationProvider有一个实现类是DaoAuthenticationProvider,
在这里面有一个retrieveUser的方法,这里是调用UserDetailsService这个接口的实现,获取用户的信息,到这里就走到了流程的UserDetailsService的步骤。
拿到用户的信息后回到Provider里面他会做一个预检查,预检查检查三个布尔类型的值。
然后调了一个附加检查,检查密码是否匹配
后检查,检查最后的一个布尔。
所有的检查通过后创建了一个新的UsernamePasswordAuthenticationToken
然后会返回到AbstractAuthenticationProcessingFilter,然后调我们写的认证成功后的处理
2.认证结果如何在多个请求之间共享
我们注意到在认证成功返回的时候会有这样一个操作
SecurityContext就是对认证结果的一个简单的封装,里面有认证过的Authentication
SecurityContextHolder是对ThreadLocal做了一个封装。
SecurityContextPersistenceFilter这个过滤器保证了认证结果在多个请求之间共享,当请求过来了以后会到这个过滤器,他会检查session里面是否有SecurityContext,如果有就把SecurityContext从Session里面拿出来放到线程里面,当请求回来的时候也会检查这个SecurityContext(线程)有没有,如果有就拿出来放到Session里面。
如何在普通的类中拿到当前的请求的session信息,网上是提供了一个方法:https://www.cnblogs.com/yangzhilong/p/11425072.html,但是在JWT的模式下是拿不到的。
3.获取认证用户信息