概要
spring security底层实现为一条过滤器链。用户请求进来,判断有没有请求的权限,没有者抛出异常,重定向跳转。
组件
1.SecurityContextHolder
SecurityContextHolder他负责存储当前访问的上下文信息。SecurityContextHolder默认使用ThreadLocal来存储认证信息。当用户登陆成功时将Authentication放入SecurityContextImpl中,然后存入SecurityContextHolder,登出时移除。
2.Authentication
public interface Authentication extends Principal, Serializable {
// 认证信息集合,可以是角色(role)或权限(permissions)
Collection<? extends GrantedAuthority> getAuthorities();
//密码信息,由用户输入的密码凭证,认证之后会移出,来保证安全性;
Object getCredentials();
//详细信息,Web应用中一般是访问者的ip地址和sessionId
Object getDetails();
//身份信息,一般返回UserDetails的实现类
Object getPrincipal();
//是否被认证
boolean isAuthenticated();
//设置认证
void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}
3.UserDetails和UserDetailsService
public interface UserDetails extends Serializable {
Collection<? extends GrantedAuthority> getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}
public interface UserDetailsService {
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
UserDetailsService 只有一个方法。从数据库中加载用户信息。这个接口需要开发者实现
4.AuthenticationManager
public interface AuthenticationManager {
//发起认证
Authentication authenticate(Authentication authentication)
throws AuthenticationException;
}
AuthenticationManager接口只包含一个方法,那就是认证也是发起认证的出发点。默认的实现ProviderManager。
ProviderManager里维护了一组AuthenticationProvider,根据supports方法判断是否使用那个AuthenticationProvider
5.AuthenticationProvider
public interface AuthenticationProvider {
// 认证
Authentication authenticate(Authentication authentication)
throws AuthenticationException;
//是否支持
boolean supports(Class<?> authentication);
}
真正认证逻辑。
Spring Security中提供的AuthenticationProvider实现:
- DaoAuthenticationProvider 从数据库中读取用户信息验证身份
- AnonymousAuthenticationProvider 匿名用户身份认证
- RememberMeAuthenticationProvider 已存cookie中的用户信息身份认证
- AuthByAdapterProvider 使用容器的适配器验证身份
- CasAuthenticationProvider 根据Yale中心认证服务验证身份,用于实现单点登陆
- JaasAuthenticationProvider 从JASS登陆配置中获取用户信息验证身份
- RemoteAuthenticationProvider 根据远程服务验证用户身份
- RunAsImplAuthenticationProvider 对身份已被管理器替换的用户进行验证
- X509AuthenticationProvider 从X509认证中获取用户信息验证身份
- TestingAuthenticationProvider 单元测试时使用
认证流程
过滤器链
- 绿色的过滤器是可配置的,绿色filter代表若干种认证方式,可以通过配置来决定,其他颜色是必须存在的
- FilterSecurityInterceptor为最后一道拦截器,会根据前面绿色的过滤器配合,配置当中的url与特定授权方式,来决定是否可以访问api
- ExceptionTranslationFilter为处理FilterSecurityInterceptor抛出的异常,根据配置文件来引导用户去验证。
Spring Security全览
中文文档
https://www.springcloud.cc/spring-security-zhcn.html#what-is-acegi-security