今天不划水了-来了解Security登陆认证相关组件 | 8月更文挑战

128 阅读2分钟

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。提供了完善的认证机制和方法级的授权功能。它的核心是一组过滤器链,通过不同的过滤器来达到细粒度的权限控制.今天咱们来了解一下Security用户登陆认证相关组件

相关组件

UserDetailsService

UserDetailsService是一个接口,只提供一个方法.用来加载用户信息,需要我们通过数据库或其他方式实现用户数据的获取来交给security

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

UserDetails

UserDetailsService返回的UserDetails是一个用户信息集.包括用户的权限信息,用户状态,提供了多个认证信息,如果觉得不够,还可以自己继续实现自定义认证

public interface UserDetails extends Serializable {

    //  我们自定义的用户权限集
  Collection<? extends GrantedAuthority> getAuthorities();
    //  用户加密后的密码
  String getPassword();
    //  用户名
  String getUsername();
    //  用户是否过期
  boolean isAccountNonExpired();
    //  用户是否被锁定
  boolean isAccountNonLocked();
    //  用户凭证是否过期
  boolean isCredentialsNonExpired();
    //  用户是否可用
  boolean isEnabled();
}

Authentication

这是用户信息的最终形式,security认证时会将UserDetails信息封装到Authentication,用于security其他对象来使用

public interface Authentication extends Principal, Serializable {

  // 获取用户权限,一般情况下获取到的是我们自定义的用户权限集(角色或接口权限等)
  Collection<? extends GrantedAuthority> getAuthorities();

  // 获取证明用户认证的信息,一般情况下获取到的是密码等信息。
  Object getCredentials();

  // 获取用户的额外信息.(这里可以放入我们的用户对象信息)。
  Object getDetails();

  // 获取用户身份信息,自定义的用户标识,一般是用户名或者用户ID等唯一标识
  Object getPrincipal();

  // 获取当前 Authentication 是否已认证
  boolean isAuthenticated();

  // 设置当前 Authentication 是否已认证
  void setAuthenticated(boolean var1) throws IllegalArgumentException;

}

SecurityContext

上下文对象,Authentication 对象会放在里面。

public interface SecurityContext extends Serializable {
 // 获取Authentication对象
 Authentication getAuthentication();

 // 放入Authentication对象
 void setAuthentication(Authentication authentication);
}

SecurityContextHolder

SecurityContextHolder用于存储安全上下文(security context)的信息,可以通过SecurityContextHolder中的静态方法获取到当前用户的认证信息

public class SecurityContextHolder {
 // 清除SecurityContext对象
 public static void clearContext() {
  strategy.clearContext();
 }
 // 获取SecurityContext对象
 public static SecurityContext getContext() {
  return strategy.getContext();
 }
 // 放入SecurityContext对象
 public static void setContext(SecurityContext context) {
  strategy.setContext(context);
 }

}

AuthenticationManager

AuthenticationManager 是用户认证相关的核心接口,它定义了一个认证方法,它将一个未认证的 Authentication传入 ,返回一个已认证的 Authentication 。它的默认实现类是 ProviderManager

public interface AuthenticationManager {
 // 认证方法
 Authentication authenticate(Authentication authentication)
   throws AuthenticationException;
}