用户认证流程源码
1. UsernamePasswordAuthenticationFilter-实现类
简单来说,两步。
① 封装对象;
② 管理认证器进行认证。
详细。
调用authenticate认证方法 –>
1.1 将传入的username和password封装到UsernamePasswordAuthenticationToken-实现类对象中。
1.2 调用ProviderManager-实现类的方法authentic进行后续认证。
2. ProviderManager-实现类
简单来说,选取合适认证器进行认证,并且封装认证结果
详细。
调用AbstractUserDetailsAuthenticationProvider-抽象类的authenticate模板方法进行用户认证,并且返回认证结果。模板方法中具体调用的方法实现是DaoAuthenticationProvider-实现类
3. AbstractUserDetailsAuthenticationProvider 和 DaoAuthenticationProvider
简单说,三步。
① 根据用户名获取数据库中用户信息,并且封装成UserDetails-接口对象;
② 根据UserDetails对象的密码和前文封装的UsernamePasswordAuthenticationToken对象的密码进行匹配;
③ 以上操作都成功的话,将UserDetails对象封装到UsernamePasswordAuthenticationToken对象中,然后返回。
模板方法:
UserDetails user = retrieveUser(username, (UsernamePasswordAuthenticationToken) authentication);
void additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken) authentication);
Authentication result = createSuccessAuthentication(principalToReturn, authentication, user);
详细。
3.1 调用retrieveUser 方法,此方法中UserDetails loadedUser = this.userDetailsService.loadUserByUsername(username);的方法根据用户名查询数据库用户信息。
(这步是需要开发人员自己实现认证业务,即实现userDetailsService的loadUserByUsername(String username)方法;
并且封装UserDetails对象,保存角色权限信息到此对象中。同样需要开发人员定义实现类);
3.2 将通过用户名认证成功的UserDetails对象的密码和UsernamePasswordAuthenticationToken对象的密码进行匹配。即用户输入的密码和库中存的密码进行匹配。
3.3 帐号密码认证成功后,将UserDetails对象的用户名,密码,角色权限信息等封装到UsernamePasswordAuthenticationToken对象中。(UsernamePasswordAuthenticationToken对象将保存到上下文中)