1.AuthenticationManager是一个接口,只有一个方法 authenticate,入参和返回值都 Authentication。
AuthenticationManager接口:
2.ProviderManager实现了AuthenticationManager接口,ProviderManager委托AuthenticationProvider接口去实现认证过程,有个抽象方法authenticate
ProviderManager实现的authenticate方法:
AuthenticationProvider接口:
3.AbstractUserDetailsAuthenticationProvider实现了AuthenticationProvider接口并实现了authenticate方法,DaoAuthenticationProvider类继承了AbstractUserDetailsAuthenticationProvider,登录过程是在AbstractUserDetailsAuthenticationProvider的AuthenticationProvider方法中认证。
4. 调用DaoAuthenticationProvider的retrieveUser获取用户信息UserDetails,参数是根据用户名
5.获取到用户信息后,进行三次检查。
首先调用内部类DefaultPreAuthenticationChecks的check检查用户是否锁定,是否可用,账号是否过期
然后调用 DaoAuthenticationProvider类的additionalAuthenticationChecks方法校验用户的密码是否正确
最后调用内部类DefaultPostAuthenticationChecks的check方法验证用户的认证凭证是否过期(一般指密码 )
6.都验证通过后,会调用createSuccessAuthentication方法创建一个认证过的UsernamePasswordAuthenticationToken实例,传入账号,密码,权限。