概要
spring security底层实现为一条过滤器链。用户请求进来,判断有没有请求的权限,没有者抛出异常,重定向跳转。

组件

1.SecurityContextHolder

SecurityContextHolder他负责存储当前访问的上下文信息。SecurityContextHolder默认使用ThreadLocal来存储认证信息。当用户登陆成功时将Authentication放入SecurityContextImpl中,然后存入SecurityContextHolder,登出时移除。

2.Authentication

  1. public interface Authentication extends Principal, Serializable {
  2. // 认证信息集合,可以是角色(role)或权限(permissions)
  3. Collection<? extends GrantedAuthority> getAuthorities();
  4. //密码信息,由用户输入的密码凭证,认证之后会移出,来保证安全性;
  5. Object getCredentials();
  6. //详细信息,Web应用中一般是访问者的ip地址和sessionId
  7. Object getDetails();
  8. //身份信息,一般返回UserDetails的实现类
  9. Object getPrincipal();
  10. //是否被认证
  11. boolean isAuthenticated();
  12. //设置认证
  13. void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
  14. }

3.UserDetails和UserDetailsService

  1. public interface UserDetails extends Serializable {
  2. Collection<? extends GrantedAuthority> getAuthorities();
  3. String getPassword();
  4. String getUsername();
  5. boolean isAccountNonExpired();
  6. boolean isAccountNonLocked();
  7. boolean isCredentialsNonExpired();
  8. boolean isEnabled();
  9. }
  1. public interface UserDetailsService {
  2. UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
  3. }

UserDetailsService 只有一个方法。从数据库中加载用户信息。这个接口需要开发者实现

4.AuthenticationManager

  1. public interface AuthenticationManager {
  2. //发起认证
  3. Authentication authenticate(Authentication authentication)
  4. throws AuthenticationException;
  5. }

AuthenticationManager接口只包含一个方法,那就是认证也是发起认证的出发点。默认的实现ProviderManager。

ProviderManager里维护了一组AuthenticationProvider,根据supports方法判断是否使用那个AuthenticationProvider

5.AuthenticationProvider

  1. public interface AuthenticationProvider {
  2. // 认证
  3. Authentication authenticate(Authentication authentication)
  4. throws AuthenticationException;
  5. //是否支持
  6. boolean supports(Class<?> authentication);
  7. }

真正认证逻辑。

Spring Security中提供的AuthenticationProvider实现:

  • DaoAuthenticationProvider 从数据库中读取用户信息验证身份
  • AnonymousAuthenticationProvider 匿名用户身份认证
  • RememberMeAuthenticationProvider 已存cookie中的用户信息身份认证
  • AuthByAdapterProvider 使用容器的适配器验证身份
  • CasAuthenticationProvider 根据Yale中心认证服务验证身份,用于实现单点登陆
  • JaasAuthenticationProvider 从JASS登陆配置中获取用户信息验证身份
  • RemoteAuthenticationProvider 根据远程服务验证用户身份
  • RunAsImplAuthenticationProvider 对身份已被管理器替换的用户进行验证
  • X509AuthenticationProvider 从X509认证中获取用户信息验证身份
  • TestingAuthenticationProvider 单元测试时使用

认证流程

spring-security - 图1

spring-security - 图2

过滤器链

spring-security - 图3

  1. 绿色的过滤器是可配置的,绿色filter代表若干种认证方式,可以通过配置来决定,其他颜色是必须存在的
  2. FilterSecurityInterceptor为最后一道拦截器,会根据前面绿色的过滤器配合,配置当中的url与特定授权方式,来决定是否可以访问api
  3. ExceptionTranslationFilter为处理FilterSecurityInterceptor抛出的异常,根据配置文件来引导用户去验证。

Spring Security全览

spring-security - 图4

中文文档

https://www.springcloud.cc/spring-security-zhcn.html#what-is-acegi-security