Spring Security
1、核心是FilterChainProxy,里面维护了SecurityFilterChain 列表,
public class FilterChainProxy extends GenericFilterBean {
……….
private List<SecurityFilterChain> filterChains;
……….
}
每个SecurityFilterChain 维护了Filter 列表,和一个请求路径的匹配器,
public interface SecurityFilterChain {
boolean matches(HttpServletRequest request);
List<Filter> getFilters();
}
请求过来的时候,会先委托给FilterChainProxy,然后FilterChainProxy 遍历SecurityFilterChain 列表,判读是否匹配这个请求,匹配到的话,就取出SecurityFilterChain 里面的List<Filter> 过滤器链,执行过滤。
也就是说每种匹配路径的请求,比如:/api/**、/page/** 都有一个过滤器链
2、各个过滤器的介绍
- FilterSecurityInterceptor 对请求资源权限的校验,比如hasRose(“ROLE_ADMIN”),如果权限校验不通过,抛出AccessDeniedException
- ExceptionTranslationFilter 针对过滤链中抛出的AccessDeniedException 和AuthenticationException 异常进行处理,根据实际情况决定是否跳转到某个authenticationEntryPoint(正常都是配置登陆页)或者调用异常处理器
- ...待补充...
Spring Security OAuth2.0
1、资源服务跟授权服务分离,对access_token 的请求由Spring MVC 提供的endPoint 处理,对受保护的资源由Spring Security Chain 拦截校验
2、OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用
3、OAuth2.0 支持的四种授权模式:
- 授权码模式(authorization code):最严谨、安全的方式
- 简化模式(implicit):适用于纯前端应用
- 密码模式(resource owner password credentials):信任某个第三方应用,提供用户名和密码,也可以根据业务需求,为第三方应用在服务商那边申请的账号
- 客户端模式(client credentials):针对第三方应用的,而不是针对用户,通常不涉及用户相关信息,可以获取服务商提供的通用资源
4、oauth2 服务器有三个重要的配置:
- ClientDetailsServiceConfigurer 定义对clientDetail 的管理
- AuthorizationServerSecurityConfigurer 定义对提供的endpoint 的安全约束
- AuthorizationServerEndpointsConfigurer 定义授权和令牌端点以及令牌服务
5、oauth2 几个重要的类:
- ClientDetailsService 对ClientDetail 的管理接口,正常是使用实现类JdbcClientDetailsService,或者是在这个类上扩展
- AuthorizationServerTokenServices 对access_token 进行管理的接口,正常使用其实现类DefaultTokenServices 管理access_token,对access_token 的持久化委托给TokenStore
- TokenStore 实际持久化access_token 的接口,有多个实现类,包括内存持久,redis持久,jdbc持久,实际项目上实现该接口,自定义实现类
- UserDetailsService 认证时加载用户数据的接口,项目是实现该类,从mysql 中获取用户数据
- AuthorizationCodeServices 用于授权码模式生成code,默认有于内存和JDBC 的实现,项目中实现该接口,持久到redis
6、密码模式、客户端模式拦截器,正常是一致,因为都是使用同一个端点:/oauth/token
密码模式:
客户端模式: