这是我参与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;
}