版本是2.1.0.RELEASE;
创建UsernamePasswordAuthenticationToken
private final AuthenticationManagerBuilder authenticationManagerBuilder;
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
参数解析:
username和password是前端传过来的
点进去authenticate()方法,有多个实现类,选择ProviderManager
继续点进去authenticate()方法,有多个实现类,选择AbstractUserDetailsAuthenticationProvider
首先是有一个判断,从Cache中取,实现类走的是NullUserCache;如果返回null,调用receiveUser方法;如果不是返回null,则检查user是否正确;
我们这里返回null,所以走的是receiveUser,点进去;
点进去loadUserByUsername()方法
找到我们自己的实现类UserDetailsServiceImpl,实现了UserDetailsService该接口;
这个方法是我们自己重写的;
先判断是否配置登录缓存,有缓存的话,直接get就行;
如果没有缓存,会先查询数据库,然后再次放入缓存,方便下次直接取出;
跳出loadUserByUsername,在跳出receiveUser,继续往下走
调用的是该实现类AbstractUserDetailsAuthenticationProvider的内部类DefaultPreAuthenticationChecks的check方法;该check方法检查的就是用户是否锁定,是否被禁用,是否超时;
进去additionalAuthenticationChecks方法,对比密码是否匹配
就是检查前端传过来的password和通过username查出来的password是否一样,不一样则抛出异常;
再检查凭证是否超时
最后就是依据正确的信息创建Authentication