概要
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地址和sessionIdObject 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
