Spring Security用户名密码登陆分析
最近在做Spring Security 单点集成的SSO项目,项目完成后,索性就研究了下其底层源码的具体实现。接下来,为大家分享一下用户名密码登陆的源码解析:
首先,我们来看下下面这张类图。

1,顶层的抽象父类过滤器AbstractUserDetailsAuthenticationProvider是整个登陆流程的开始。在父类过滤器里面,会先执行子类UsernamePasswordAuthenticationFilter过滤器的一个方法:attemptAuthentication()

2,AuthenticationManager 实例化出来一个AuthenticationProvider 然后再AuthenticationProvider里面进行校验 不通的登陆方式不一样 我们表单提交是用户名密码登陆,ProviderManager负责收集所有的AuthenticationProvider 然后循环遍历调用supports 看是否是用户名密码的登陆方式,主要是查看类是否是UsernamePasswordAuthenticationToken 这个类,初始化的时候设置为false

3,DaoAuthenticationProvider 里面拿到UserDetails
4,预检查查看用户是否冻结,是否锁定,检查密码是否正确,具体检查可以跟进代码去看一下

5,所有的检查成功,则返回AbstractUserDetailsAuthenticationProvider

6,最后设置授权为true已授权

7,所有认证通过,返回一个Authentication,然后把数据保存到会话中。最后沿路返回。AbstractAuthenticationProcessingFilter 在这里设置成功失败过滤器,也就是自己定义的过滤器

8,如果认证失败,则会抛出异常,走自己定义的失败过滤器

以上:则是主要的用户名密码登陆流程。