2024-04-11  2024-04-11    1047 字  3 分钟

用户认证流程源码

1. UsernamePasswordAuthenticationFilter-实现类

简单来说,两步。

① 封装对象;

② 管理认证器进行认证。

详细。 调用authenticate认证方法 –> 1.1 将传入的usernamepassword封装到UsernamePasswordAuthenticationToken-实现类对象中。

1.2 调用ProviderManager-实现类的方法authentic进行后续认证。

2. ProviderManager-实现类

简单来说,选取合适认证器进行认证,并且封装认证结果

详细。 调用AbstractUserDetailsAuthenticationProvider-抽象类authenticate模板方法进行用户认证,并且返回认证结果。模板方法中具体调用的方法实现是DaoAuthenticationProvider-实现类

3. AbstractUserDetailsAuthenticationProviderDaoAuthenticationProvider 简单说,三步。

① 根据用户名获取数据库中用户信息,并且封装成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);的方法根据用户名查询数据库用户信息。 (这步是需要开发人员自己实现认证业务,即实现userDetailsServiceloadUserByUsername(String username)方法; 并且封装UserDetails对象,保存角色权限信息到此对象中。同样需要开发人员定义实现类);

3.2 将通过用户名认证成功的UserDetails对象的密码和UsernamePasswordAuthenticationToken对象的密码进行匹配。即用户输入的密码和库中存的密码进行匹配。

3.3 帐号密码认证成功后,将UserDetails对象的用户名,密码,角色权限信息等封装到UsernamePasswordAuthenticationToken对象中。(UsernamePasswordAuthenticationToken对象将保存到上下文中)