用户认证流程源码
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
对象将保存到上下文中)