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