Spring Security身份认证之UserDetailsService
什么是Spring Security中的身份认证?
让我们考虑一个每个人都熟悉的标准身份验证方案。
- 提示用户使用用户名和密码登录。
- 系统(成功)验证密码对于用户名是否正确。
- 获取该用户的上下文信息(他们的角色列表等)。
- 为用户建立安全上下文
- 用户继续进行,可能执行一些可能受访问控制机制保护的操作,该访问控制机制针对当前安全上下文信息检查操作所需的许可。
一、了解UserDetailsService在身份认证中的作用
现在我们对Spring Security的架构和核心类进行高度的概括,他们分别是一个或者两个核心接口以及其实现类, Spring Security中进行身份验证的是AuthenticationManager接口,ProviderManager是它的一个默认实现,但它并不用来处理身份认证,而是委托给配置好的AuthenticationProvider列表,每个AuthenticationProvider会轮流检查身份认证。检查后或者返回Authentication对象或者抛出异常。
UserDetailsService实现
大多数的身份认证提供程序都利用了UserDetails和UserDetailsService接口,身份认证最常用的方法是加载相应的UserDetails并检查加载的密码和用户输入的密码,通过查看两者和源码:
UserDetails
public interface UserDetails extends Serializable {
Collection<? extends GrantedAuthority> getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}
UserDetailsService
public interface UserDetailsService {
UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;
}
可以发现:
UserDetails接口->Spring Security的基础接口,包含了用户的账号、密码、状态(是否锁定)、权限等信息。
UserDetailsService接口->提供了给用户获取信息的方法,所以它就定义了一个接口,然后由你去实现它,在Spring Security快加里提供的UserDetailsService接口默认实现了:
- 内存身份验证(InMemoryDaoImpl):存储于内存空间
- JdbcDaoImpl:存储于数据库(磁盘上)
总结:简单来说,UserDetailService只单纯地负责存取用户信息,除了给框架内的其他组件提供数据外没有其他功能。而认证过程是由AuthenticationManager来完成的。