Spring Security深入浅出--2、认证流程源码级详解(一)

认证流程源码级详解

认证流程说明

 启动项目

点击登录,进入到UsernamePasswordAuthenticationFilter类中

然后获取用户名和密码

obtainUsername()和obtainPassword()方法获取用户名和密码起底层就是
request.getParameter("username");

request.getParameter("password");

调用UsernamePasswordAuthenticationToken类

进入到UsernamePasswordAuthenticationToken类中,也就是给本地的principal和credentials赋值

 由于刚刚开始,父类权限还没传入,所以传入的是null

setAuthenticated()方法判断的是当前是否进行了身份认证,由于是刚刚传入的,所以还没有进行身份认证,所以是false

回来,实例化authRequest,通过setDetails(request, authRequest)将请求request里面的其他信息传入的authRequest中

 底层就是获取request地址以及session给authRequest的details赋值

调用 AuthenticationManager类,这个类主要其到管理的作用

由于 AuthenticationManager是接口,整个赋值是在security启动的时候

继续debug,进入到ProviderManager类,可以看到他就是实现了AuthenticationManager接口

获取AuthenticationProvider,因为校验逻辑都写在里面,为什么是集合,因为不同的登陆方式,校验逻辑是不一样的 

判断当前的authentication是否支持,当前getClass的类型是UsernamePasswordAuthenticationToken方式的校验。因为还有其他的第三方校验方式如微信,qq等,他们使用的就不是UsernamePasswordAuthenticationFilter,而是SocialAuthenticationFilter

当支持的时候就会往下继续执行,否则就继续循环,具体的实现DaoAuthenticationProvider,但是authenticate()方法是在他的抽象类AbstractUserDetailsAuthenticationProvider中实现的

在 authenticate()方法中,调用retrieveUser()方法获取user(UserDetails)类,

获取的UserDetails就是我们自定义的那个UserDetails,并且调用了loadUserByUsername()方法

紧着着就是对user(UserDetails)进行校验

对user校验完毕之后,紧接着调用了additionalAuthenticationChecks()方法,对用户传入的密码和数据库查询出来的密码进行校验

上面的两个检查完毕,进入到下面的postAuthenticationChecks.check(user);

检查四个布尔值,以及密码没有问题之后,调用createSuccessAuthentication(principalToReturn, authentication, user);

在createSuccessAuthentication()中,调用的是UsernamePasswordAuthenticationToken()四个参数的构造函数,并且设置super.setAuthenticated(true);

最后返回一个以及认证的Authentication。最后一路返回到UsernamePasswordAuthenticationFilter类中

发布了469 篇原创文章 · 获赞 94 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_37909508/article/details/103944086