Security--03(认证流程的源码)

目录

 

1.认证处理流程说明

2.认证结果如何在多个请求之间共享

3.获取认证用户信息


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.获取认证用户信息

   

猜你喜欢

转载自blog.csdn.net/weixin_37650458/article/details/106632334
今日推荐