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); // 预检查,我们进去看看他的源码是什么?

这很明显是对我们用户中的四个属性进行了检查,比如这个用户是否被删除,是否冻结,是否过期等校验


愿你出走半生,归来仍是少年