1、触发UsernamePasswordAuthenticationFilter
其返回值是一个方法 **getAuthenticationManager().authenticate(authRequest)** 的返回值
//将用户输入封装
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDB.getUsername(), user.getPassword());
//调用authenticationManager.authenticate()方法进行验证
Authentication authenticate = authenticationManager.authenticate(authenticationToken);
2、ProviderManager
进入getAuthenticationManager().authenticate(authRequest)方法,发现它是在ProviderManager中实现的方法——provider.authenticate(authentication),其返回值是result,记住此时的authentication是封装的输入的账户密码。
3、AbstractUserDetailsAuthenticationProvider
进入provider.authenticate(authentication)方法后发现我们到了AbstractUserDetailsAuthenticationProvider类,而这个方法的返回值需要需要依赖user,要获取这个user,咱又不得不进入retrieveUser(username, (UsernamePasswordAuthenticationToken) authentication) 这个方法。在得到这个user之后才能进行下一步。
4、DaoAuthenticationProvider
由user = this.retrieveUser(username, (UsernamePasswordAuthenticationToken)authentication);**进入到DaoAuthenticationProvider**类,观察该方法的返回值,发现了熟悉的**loadUserByUsername(username)** 方法
5、UserDetailsServiceImpl
这正是自定义的userservice实现类,而其返回值就是从数据库查出来的用户名和密码。接下来原路返回
6、DaoAuthenticationProvider
回到第三步,此时我们已经获取了其中的user,接下来就是进行密码验证了,进入additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken) authentication) 即验证数据库与输入信息是否相符。
整个流程到此基本就结束了,里面的密码校验方法可参考:security密码校验 密码验证登录逻辑
版权归原作者 念衢 所有, 如有侵权,请联系我们删除。