Spring Security 认证流程源码分析
1.Spring Security 认证流程介绍:
在前边我们讲了Spring Security的基本执行流程,这里不难看出,首先会经过的认证过滤器是UsernamePasswordAuthenticationFilter,我们就从这里下手,进行源码分析 !
UsernamePasswordAuthenticationFilter 执行流程:
UsernamePasswordAuthenticationFilter 的执行流程图大概是这样的:
1.UsernamePasswordAuthenticationFilter:
请求第一步会先进到这里,先从请求中获得了用户名和密码,接着将这些基本信息封装成了一个UsernamePasswordAuthenticationToken对象
我们看看UsernamePasswordAuthenticationToken究竟是什么吧~
再看看AbstractAuthenticationToken又是谁的实现 ?
Authentication接口的作用就是封装我们的认证信息
好了,接着分析代码:
UsernamePasswordAuthenticationToken的构造器中有这样几行代码:
public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
super(null); // 当前用户具备什么权限(我们暂时还不知道)
this.principal = principal; // 将用户名存储到当前类全局变量中
this.credentials = credentials;// 将密码存储到当前类全局变量中
setAuthenticated(false); // 这个信息是否经过身份认证了?(当然是false)
}
接下来setDetails(request,authRequest)这行代码,是将请求中的其他参数也存给刚刚封装的UsernamePasswordAuthenticationToken对象,比如机器的ip地址等信息
然后到了最后一句
return this.getAuthenticationManager().authenticate(authRequest);
这里就进入下一个类了 AuthenticationManager。
2.AuthenticationManager
我们直接从这里进去,看看它做了些什么?
Class<? extends Authentication> toTest = authentication.getClass();
/**
* 这行代码获取了我们传入的Authtication的字节码类型,然后在接下来的循环里找出对应的provider对象进行
* 校验处理
*/
当我们找到了对应的provider之后,就开始进行校验处理的方法:
3.AuthticationProvider
这里我们要对应的是AbstractUserDetailsAuthenticationProvider类
这里重点关注这行代码:
user = retrieveUser(username,
(UsernamePasswordAuthenticationToken) authentication);
进到这个方法的实现以后,是DaoAuthticationProvider类,接下来就到了获取UserDetails的环节了 !
4.UserDetailsService&UserDetails
从上面这个图中的
UserDetails loadedUser = this.getUserDetailsService().loadUserByUsername(username);
// 这行代码即直接调用了我们在
然后我们再回到AbstractUserDetailsAuthenticationProvider类中看看接下去做了些什么
接下去
preAuthenticationChecks.check(user); // 预检查,我们进去看看他的源码是什么?
这很明显是对我们用户中的四个属性进行了检查,比如这个用户是否被删除,是否冻结,是否过期等校验