Spring security认证流程
一、 过滤器:UsernamePasswordAuthenticationFilter
1、发起认证:authenticate()
默认调用ProviderManager类authenticate()方法
this.getAuthenticationManager().authenticate(authRequest);
1.1、 管理者组:AuthenticationManager
获取管理者,默认管理者ProviderManager。
protected AuthenticationManager getAuthenticationManager() {
return this.authenticationManager;
}
1.2、 认证信息:UsernamePasswordAuthenticationToken
获取账户信息,封装数据到认证类。
String username = this.obtainUsername(request);
String password = this.obtainPassword(request);
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
二 、管理者:ProviderManager
1、发起认证:authenticate()
默认调用AbstractUserDetailsAuthenticationProvider类authenticate()方法
result = provider.authenticate(authentication);
1.1、提供者组:AuthenticationProvider
获取提供者,默认提供者AbstractUserDetailsAuthenticationProvider
AuthenticationProvider provider = (AuthenticationProvider)var8.next();
三、 提供者:AbstractUserDetailsAuthenticationProvider
1、用户信息:retrieveUser()
默认调用DaoAuthenticationProvider类retrieveUser()方法
user = this.retrieveUser(username, (UsernamePasswordAuthenticationToken)authentication);
}
1.1 提供者:DaoAuthenticationProvider
默认调用InMemoryUserDetailsManager类loadUserByUsername()方法
UserDetails loadedUser = this.getUserDetailsService().loadUserByUsername(username);
1.1.1 信息者组:UserDetailsManager
获取信息者,默认信息者InMemoryUserDetailsManager
protected UserDetailsService getUserDetailsService() {
return this.userDetailsService;
}
2、判断账号状态:check()
isAccountNonExpired():当前账号是否已经过期
isAccountNonLocked():当前账号是否被锁
isEnabled():当前账号是否被禁用
this.preAuthenticationChecks.check(user);
3、判断账号密码:additionalAuthenticationChecks()
this.additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken)authentication);
4 、判断账号状态 :check()
isCredentialsNonExpired():当前账号证书(密码)是否过期
this.postAuthenticationChecks.check(user);
四 、信息者:InMemoryUserDetailsManager
1、获取用户信息:loadUserByUsername()
UserDetails user = (UserDetails)this.users.get(username.toLowerCase());
五、自定义信息者:XXXUserDetailsServiceIpml
public class XXXUserDetailsServiceIpml implements UserDetailsService
1、具体逻辑代码
public UserDetails loadUserByUsername(String username){
1、获取用户账号密码,每次接口调用都会被调用,所以应当取缓存,取不到在获取数据库。
2、赋值,User类提供了返回的构造方法。实现了UserDetails接口类
return new User(username, password, enabled, true, true, true, AuthorityUtils.NO_AUTHORITIES);
}
2、接口类:UserDetails
public interface UserDetails extends Serializable {
Collection<? extends GrantedAuthority> getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}
3、方法解释
getPassword():用户密码
getUsername():用户名称
下面4个方法值,必须为ture。否则会报相应错误
isAccountNonExpired():当前账号是否已经过期
isAccountNonLocked():当前账号是否被锁
isCredentialsNonExpired():当前账号证书(密码)是否过期
isEnabled():当前账号是否被禁用