SpringSecurity 是一个强大的、高度可定制的身份验证和访问控制框架,它是确保基于 Spring 的应用程序安全的事实标准。
Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.
笔记的版本为 Spring Security-4.0 与 Spring Framework 5.0.5.RELEASE
。这个笔记只是把 Spring Security 的 Docs 简化并抄了一遍(算是 google 翻译加官方文档的省略版,哈哈),也可以自己去看,传送门。
目录
第一部分 基本介绍
- 前言
- 介绍什么是 SpringSecurity
- Spring Security 的几种认证方式
- Spring Security 的包目录结构
- Spring Security 配置
- 开启 HttpSecurity 配置
- 处理登录请求
- 授权请求,验证 url
- 处理登出请求
- JDBC、Memory 认证
- 多重 HttpSecurity 配置
- 方法级别的安全配置
- 开启方法安全配置
- 两种方法级别的注释
- 示例
第二部分 体系结构和实现
- SpringSecurity 的核心组件
- SecurityContextHolder - Security 上下文
- SecurityContext - 从上下文中获取当前用户主体
- Authentication - 当前用户主体信息
- GrantedAuthority - 用户权限
- UserDetails - 用户主体的具体实现
- UserDetailsService - 加载当前用户主体的实现
- SpringSecurity 身份认证流程
- 模拟一个标准的身份认证环境
- web 程序中的身份认证流程
- 认证流程中的核心对象
- 安全拦截器与安全对象模型
- Security 与 AOP 的 around 通知
- 第七章 Spring Security 中的核心服务
- UsernamePasswordAuthenticationFilter - 用户名密码登录过滤器(责任链模式)
- ProviderManager - 认证管理类(迭代器模式)
- DaoAuthenticationProvider - 数据认证
- UserDetailsService - 获取具体用户实体
- PasswordEncoder - 用户密码加密
- UserDetails - 用户对象
第三部分 测试支持
- Spring Security 的单元测试支持
- @WithMockUser - 使用 Mock 的对象
- @WithAnonymousUser - 使用匿名 Mock 对象
- @WithUserDetails - 使用 DB 中的对象,需要数据库连接
- 自定义测试注解
- 模仿@WithMockUser - 使用自定义的对象
- 重写 WithSecurityContextFactory - 生成自定义的对象,并注入 SecurityContextHolder
- Spring Security 对 WebFlux 测试的支持
- TODO:没用过 WebFlux,等我学到了再回来补充,flag 先立起来
第四部分 Web 应用安全原理
-
Filter Ordering - 过滤链顺序如下
- ChannelProcessingFilter - 确保 web 请求会被 channel 通过
- SecurityContextPersistenceFilter - 加载 SecurityContext
- ConcurrentSessionFilter - 监听 session 是否改变
- AbstractPreAuthenticationProcessingFilter - 抽象身份验证处理过滤器
- UsernamePasswordAuthenticationFilter - 用户名密码验证
- CasAuthenticationFilter - Cas 验证
- BasicAuthenticationFilter - Basic 验证,请求头认证的一种
- ……
- SecurityContextHolderAwareRequestFilter - ServletAPI 与 Security 之间的包装类
- JaasApiIntegrationFilter
- RememberMeAuthenticationFilter - 以 cookie 方式进行身份验证
- AnonymousAuthenticationFilter - 匿名身份验证
- ExceptionTranslationFilter - 异常处理
- FilterSecurityInterceptor - HTTP 资源的安全处理
-
- FilterSecurityInterceptor
- ExceptionTransactionFilter
- SecurityContextPersistenceFilter
- UsernamePasswordAuthenticationFilter
Spring Security 与 Servlet API 的集成
- getRemoteUser() - 登录用户名
- getUserPrincipal() - 登录用户
- isUserInRole(String) - 是否存在权限(去掉 ROLE 前缀)
- authenticate(HttpServletRequest,HttpServletResponse) - 是否通过了验证
- login(String,String) - 登录
- logout() - 登出
- changeSessionId() - 改变 session id
Remember-Me Authentication - “记住我”功能的实现
- Simple Hash-Based Token Approach - 简单 hash 令牌,不建议使用
- Persistent Token Approach - 持久令牌,使用 datasource 存储
CSRF
CORS - HTTP 请求控制
Session Management - 会话管理
- SessionManagementFilter - session 与 security-context 的管理
- SessionAuthenticationStrategy - session 相关的认证策略
- 固化攻击、会话超时、会话数量限制
Anonymous Authentication - 匿名身份认证
第五部分 授权体系原理
- Authorization Architecture - 授权体系结构
- Secure Object Implementations - 安全对象实现
- 使用 AOP 进行安全对象的保护
- Expression-Based Access Control - 基于表达式的访问控制
- PreAuthority(“hasRole(‘USER’)”)
- PreAuthority(“hasPermission(#contact, ‘ADMIN’)”)
第六部分 单点登录 CAS 与 OAuth2
- LDAP
- OAuth2.0
- JSP
- JAAS
- CAS
第七部分 Spring Data 集成
- Dependencies
笔记来源于 https://docs.spring.io/spring-security/site/docs/5.0.5.RELEASE/reference/htmlsingle