天天看点

Spring Security身份认证之UserDetailsService

Spring Security身份认证之UserDetailsService

什么是Spring Security中的身份认证?

让我们考虑一个每个人都熟悉的标准身份验证方案。

  1. 提示用户使用用户名和密码登录。
  2. 系统(成功)验证密码对于用户名是否正确。
  3. 获取该用户的上下文信息(他们的角色列表等)。
  4. 为用户建立安全上下文
  5. 用户继续进行,可能执行一些可能受访问控制机制保护的操作,该访问控制机制针对当前安全上下文信息检查操作所需的许可。

一、了解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来完成的。

继续阅读