用户认证流程

在这里使用用户名密码的登录方式。

登录流程

通过UsernamePasswordAuthenticationFilter获取用户名和密码,并封装成UsernamePasswordAuthenticationToken。如下图:
Spring Security用户认证流程
再通过getAuthenticationManager()方法获取AuthenticationManager进行验证。如下图:
Spring Security用户认证流程authenticate()方法如下图:
Spring Security用户认证流程
调用authentication.getClass()获取其类型,并调用getProviders().iterator()获取所有AuthenticationProvider的集合并获取迭代器进行遍历。在获取AuthenticationProvider后判断是否支持token(UsernamePasswordAuthenticationToken)类型,直到获取支持token类型的AuthenticationProvider进行认证并返回认证后的结果,如果认证后的结果不为null,则表示AuthenticationProvider认证成功。然后直接以该AuthenticationProvider的认证结果作为ProviderManager的认证结果。如果AuthenticationProvider的认证结果为null,则表示认证失败,将抛出AuthenticationException异常。

接下来,调用AuthenticationProvider(DaoAuthencationProvider默认实现类).authenticate()方法。在这个方法中调用retrieveUser()方法获取UserDetails对象如下图:
Spring Security用户认证流程
retrieveUser()方法如下图:
Spring Security用户认证流程
通过getUserDetailsService().loadUserByUsername()方法获取到了UserDetails对象。获取UserDetails对象后,接下来调用preAuthenticationChecks.check()方法以及additionalAuthenticationChecks()方法。如下图:
Spring Security用户认证流程
preAuthenticationChecks.check()方法如下:
Spring Security用户认证流程
其实这些验证就是验证UserDetails里的账号是否未锁定、是否**、账号是否未过期的方法。
additionalAuthenticationChecks()方法。如下图:
Spring Security用户认证流程
第一处:判断密码是否为null。
第二处:获取密码。
第三处:判断密码是否匹配。如果密码不匹配,抛出BadCredentialsException异常。
接下来调用了postAuthenticationChecks.check()方法。如下图:
Spring Security用户认证流程
在postAuthenticationChecks.check()方法中判断了UserDetails里密码是否未过期方法,加上上面三个方法正好一共四个方法。如下图:
Spring Security用户认证流程
接下来会把认证后的结果赋值给principalToReturn。如下图:
Spring Security用户认证流程

最终调用createSuccessAuthentication(principalToReturn, authentication, user)方法。如下图:
Spring Security用户认证流程
Spring Security用户认证流程
在这个方法中创建UsernamePasswordAuthenticationToken对象,并赋值认证成功。如下图:
Spring Security用户认证流程
在第一次创建UsernamePasswordAuthenticationToken时,调用的是两个参数的构造函数,并在认证成功赋值为false。如下图:
Spring Security用户认证流程
直到在successfulAuthentication()方法中调用SecurityContextHolder.getContext().setAuthentication(authResult)方法把Authentication(UsernamePasswordAuthenticationToken)保存到SecurityContext中。如下图:
Spring Security用户认证流程
接下来调用successHandler.onAuthenticationSuccess()方法。如下图:
Spring Security用户认证流程
onAuthenticationSuccess()方法就是认证成功后的处理。

相关文章: