SpringSecurity安全认证流程源码分析

基于SpringSecurity表单登陆进行源码分析

项目基础搭建略过

SpringSecurity安全认证基于一系列过滤器,表单提交,请求进入后端AbstractAuthenticationProcessingFilter过滤器doFilter方法
SpringSecurity安全认证流程源码分析
根据请求不同选择不同过滤器,表单提交选择UsernamePasswordAuthenticationFilter,之后具体流程为:
SpringSecurity安全认证流程源码分析
一步步分析,首先进入UsernamePasswordAuthenticationFilter的attemptAuthentication方法:
SpringSecurity安全认证流程源码分析
在该方法内构建未认证的UsernamePasswordAuthenticationToken然后把该token传入ProviderManager的authenticate方法去进行认证:
SpringSecurity安全认证流程源码分析
在该方法内,会根据传入的token去选择对应的provider处理器,此处我们传入的是UsernamePasswordAuthenticationToken,该方法经过遍历provider集合找到对应provider:
SpringSecurity安全认证流程源码分析
UsernamePasswordAuthenticationToken对应的provider是AbstractUserDetailsAuthenticationProvider:SpringSecurity安全认证流程源码分析
进入AbstractUserDetailsAuthenticationProvider的authenticate方法:
SpringSecurity安全认证流程源码分析
调用retrieveUser方法,在该方法内,开始进行认证:
SpringSecurity安全认证流程源码分析
this.getUserDetailsService().loadUserByUsername(username);该方法会查找UserDetailsService实现类,在该类里你可以自定义验证过程:
SpringSecurity安全认证流程源码分析
验证成功,原路返回AbstractAuthenticationProcessingFilter:
SpringSecurity安全认证流程源码分析
在之后,如果验证成功,会在doFilter方法结尾调用successfulAuthentication方法:SpringSecurity安全认证流程源码分析
在该方法内会把成功的认证信息放入SecurityContext
SpringSecurity安全认证流程源码分析
具体流程为:SpringSecurity安全认证流程源码分析
最后认证过的信息会放入SecurityContextHolder中,它与threadlocal绑定,可以在同线程的任何地方调取到,最后调用登陆成功处理器:
SpringSecurity安全认证流程源码分析
该处理器可以自定义实现:
SpringSecurity安全认证流程源码分析
这是整个验证成功的逻辑,如果在过程中验证失败,会抛出异常,在调用successfulAuthentication之前会被捕捉到:
SpringSecurity安全认证流程源码分析
捕捉到后会调用unsuccessfulAuthentication方法,在该方法内,最后会调用验证失败处理器:
SpringSecurity安全认证流程源码分析
同样,该处理器也可以自定义实现接口:
SpringSecurity安全认证流程源码分析