Support Statistics
¥.00 ·
0times
Text Preview (First 20 pages)
Registered users can read the full content for free
Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.
Page
1
(This page has no text content)
Page
2
随时、随地、随心阅读
Page
3
(This page has no text content)
Page
4
本书封面贴有清华大学出版社防伪标签,无标签者不得销售。 版 权 所 有 , 侵 权 必 究 。 举 报 : 010-62782989 , beiqinquan@tup.tsinghua.edu.cn。 图书在版编目(CIP)数据 深入浅出Spring Security/王松著.—北京:清华大学出版 社,2021.1 ISBN 978-7-302-57276-3 Ⅰ.①深… Ⅱ.①王… Ⅲ.①JAVA语言-程序设计 Ⅳ. ①TP312.8 中国版本图书馆CIP数据核字(2021)第005021号 责任编辑:夏毓彦 封面设计:王 翔 责任校对:闫秀华 责任印制:丛怀宇 出版发行:清华大学出版社 网 址:http://www.tup.com.cn,http://www.wqbook.com 地 址:北京清华大学学研大厦A座 邮 编:100084
Page
5
社 总 机:010-62770175 邮 购:010-62786544 投 稿 与 读 者 服 务 : 010-62776969, c- service@tup.tsinghua.edu.cn 质量反馈:010-62772015, zhiliang@tup.tsinghua.edu.cn 印 装 者:三河市铭诚印务有限公司 经 销:全国新华书店 开 本:190mm×260mm 印 张:26.25 字 数:672千字 版 次:2021年3月第1版 印 次:2021年3月第1次印刷 定 价:99.00元 产品编号:089794-01
Page
6
内容简介 Spring Security是Java企业级开发中常用的安全管理框架,也 能完美支持OAuth2。同时,Spring Security作为Spring家族的一 员,与Spring Boot、Spring Cloud等框架整合使用也非常方便。 本书分为15章,讲解Spring Security框架、认证、认证流程分 析 、 过 滤 器 链 分 析 、 密 码 加 密 、 RememberMe 、 会 话 管 理 、 HttpFirewall、漏洞保护、HTTP认证、跨域问题、异常处理、权限 管理、权限模型、OAuth2等内容。本书致力于让读者在学会Spring Security用法的同时,也能通过阅读源码来理解它的实现原理。 本书适合具有Spring Boot基础的读者、Java企业应用开发工程 师,也适合作为高等院校和培训机构计算机相关专业师生的教学参考 书。
Page
7
前言 安全管理是Java应用开发中无法避免的问题,目前主流的安全管 理框架就是Spring Security和Shiro,其中Shiro一直以使用简单和 轻量级著称。然而,随着Spring Boot和微服务的流行,Spring Security受到越来越多开发者的重视,因为Spring Security在和 Spring Boot整合时具有先天优势。 目前市面上缺少系统介绍Spring Security的书籍,网上的博客 内容又比较零散,这为很多初次接触Spring Security的Java工程师 学习这门技术带来诸多不便。 笔者最早于个人博客上连载Spring Security系列教程,连载期 间有不少读者加笔者微信讨论Spring Security的相关技术点,让笔 者感受到读者对Spring Security的热情,也因此萌生了写一本技术 图书来系统介绍Spring Security的想法。在朋友和家人的鼓励之 下,这一想法逐步付诸实践,最终完成大家现在看到的这本《深入浅 出Spring Security》。 本 书 以 Spring Security 5.3.4 为 基 础 , 详 细 介 绍 Spring Security的基本用法以及相关原理。得益于Spring Boot中的自动化 配置,Spring Security上手非常容易,然而这种自动化配置,也让 很多初次接触Spring Security的开发者“知其然,而不知其所以 然”,仅限于会用,一旦出了漏洞,或者想要定制功能时,就会不知 所措。因此,在写作本书过程中,除了基本功能的Demo演示外,还 对Spring Security的相关源码做了深入分析,以便读者“知其然, 更知其所以然”。 学习Spring Security不仅仅是学习安全管理框架,也是一个学 习各种网络攻击与防御策略的过程,Spring Security对很多常见网
Page
8
络攻击,如计时攻击、CSRF、XSS等,都提供了相应的防御策略, 因此,我们在学习Spring Security时,也可以顺便研究一下这些常 见的网络攻击,以便设计出更加安全健壮的权限管理系统。 本书分为四部分: 第一部分:第1章,这一部分总体介绍Spring Security架构,方 便读者从整体上把握Spring Security的功能。 第二部分:第2~12章,这一部分主要介绍Spring Security中的 认证功能,以及由此衍生出来的会话管理、HTTP防火墙、跨域管理 等。 第三部分:第13~14章,这一部分主要介绍Spring Security中 的授权功能,以及常见的权限模型ACL和RBAC。 第四部分:第15章,这一部分主要介绍OAuth2协议在Spring Security框架中的落地。 示例代码约定 为了减少代码冗余和本书篇幅,书中的所有示例代码片段都省略 了package和import部分,像下面这样: @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login.html")
Page
9
.loginProcessingUrl("/doLogin") .defaultSuccessUrl("/index ") .failureUrl("/login.html") .usernameParameter("uname") .passwordParameter("passwd") .permitAll() .and() .csrf().disable(); } } 有时候为了向读者演示代码的运行效果,一个案例可能会被反复 修改多次,那么在后面展示代码时,将不再列出不变的部分,仅仅列 出发生变化的代码片段,像下面这样: @Autowired TokenStore tokenStore; @Autowired JwtAccessTokenConverter jwtAccessTokenConverter; @Bean AuthorizationServerTokenServices tokenServices() { DefaultTokenServices services = new DefaultTokenServices(); services.setClientDetailsService(clientDetailsService); services.setSupportRefreshToken(true); services.setTokenStore(tokenStore); TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain(); tokenEnhancerChain .setTokenEnhancers(Arrays.asList(jwtAccessTokenConverter)); services.setTokenEnhancer(tokenEnhancerChain); return services; } //省略其他 正常情况下,这样的代码片段并不会影响大家理解本书内容。如 果读者想要看到完整的代码片段,可以下载本书提供的示例代码进行
Page
10
对照理解。 源码省略约定 在分析Spring Security源码时,为了简化源码和篇幅以便于读 者理解,源码中的日志输出、注释以及一些无关紧要的代码会被移除 掉,像下面这样: @ConfigurationProperties(prefix = "spring.security") public class SecurityProperties { private User user = new User(); public User getUser() { return this.user; } public static class User { private String name = "user"; private String password = UUID.randomUUID().toString(); private List<String> roles = new ArrayList<>(); //省略getter/setter } } 如 果 读 者 觉 得 这 样 阅 读 “ 不 过 瘾 ” , 也 可 以 下 载 Spring Security源码对照理解。 读者定位 阅读本书需要有一定的Spring Boot基础,对于无Spring Boot 基础的读者,可以先学习Spring Boot然后再来阅读本书。学习 Spring Boot,可以参考笔者编写的图书《Spring Boot+Vue全栈开 发实战》或者笔者的教程:http://springboot.javaboy.org。
Page
11
源码获取 本书所有的示例代码均存放在GitHub上,地址如下: https://github.com/lenve/spring-security-book-samples 所有工程均为标准的Maven工程,可以用IntelliJ IDEA或者 Eclipse打开。 纠错与勘误 如 果 读 者 在 阅 读 本 书 时 发 现 错 误 , 可 以 将 错 误 提 交 到 https://github.com/lenve/spring-security-book- samples/issues , 笔 者 将 错 误 内 容 汇 总 后 同 步 发 布 在 http://www.javaboy.org/spring-security-book以及微信公众号 “江南一点雨”。修正后的内容将在后续重印的书中得到体现。 交流社区 学无止境,笔者将继续对Spring Security的发展保持关注。关 于Spring Security的最新变化,笔者都将发布在微信公众号“江南 一点雨”上,读者关注微信公众号后,也可以进入本书微信交流群进 行交流。 王松 2021年1月
Page
12
目 录 第1章 Spring Security架构概览 1.1 Spring Security简介 1.2 Spring Security核心功能 1.2.1 认证 1.2.2 授权 1.2.3 其他 1.3 Spring Security整体架构 1.3.1 认证和授权 1.3.2 Web安全 1.3.3 登录数据保存 1.4 小结 第2章 Spring Security认证 2.1 Spring Security基本认证 2.1.1 快速入门 2.1.2 流程分析 2.1.3 原理分析 2.2 登录表单配置 2.2.1 快速入门 2.2.2 配置细节 2.3 登录用户数据获取 2.3.1 从SecurityContextHolder中获取 2.3.2 从当前请求对象中获取 2.4 用户定义 2.4.1 基于内存 2.4.2 基于JdbcUserDetailsManager 2.4.3 基于MyBatis 2.4.4 基于Spring Data JPA
Page
13
2.5 小结 第3章 认证流程分析 3.1 登录流程分析 3.1.1 AuthenticationManager 3.1.2 AuthenticationProvider 3.1.3 ProviderManager 3.1.4 AbstractAuthenticationProcessingFilter 3.2 配置多个数据源 3.3 添加登录验证码 3.4 小结 第4章 过滤器链分析 4.1 初始化流程分析 4.1.1 ObjectPostProcessor 4.1.2 SecurityFilterChain 4.1.3 SecurityBuilder 4.1.4 FilterChainProxy 4.1.5 SecurityConfigurer 4.1.6 初始化流程分析 4.2 ObjectPostProcessor使用 4.3 多种用户定义方式 4.4 定义多个过滤器链 4.5 静态资源过滤 4.6 使用JSON格式登录 4.7 添加登录验证码 4.8 小结 第5章 密码加密 5.1 密码为什么要加密 5.2 密码加密方案进化史 5.3 PasswordEncoder详解 5.3.1 PasswordEncoder常见实现类 5.3.2 DelegatingPasswordEncoder
Page
14
5.4 实战 5.5 加密方案自动升级 5.6 是谁的PasswordEncoder 5.7 小结 第6章 RememberMe 6.1 RememberMe简介 6.2 RememberMe基本用法 6.3 持久化令牌 6.4 二次校验 6.5 原理分析 6.6 小结 第7章 会话管理 7.1 会话简介 7.2 会话并发管理 7.2.1 实战 7.2.2 原理分析 7.3 会话固定攻击与防御 7.3.1 什么是会话固定攻击 7.3.2 会话固定攻击防御策略 7.4 Session共享 7.4.1 集群会话方案 7.4.2 实战 7.5 小结 第8章 HttpFirewall 8.1 HttpFirewall简介 8.2 HttpFirewall严格模式 8.2.1 rejectForbiddenHttpMethod 8.2.2 rejectedBlacklistedUrls 8.2.3 rejectedUntrustedHosts 8.2.4 isNormalized 8.2.5 containsOnlyPrintableAsciiCharacters
Page
15
8.3 HttpFirewall普通模式 8.4 小结 第9章 漏洞保护 9.1 CSRF攻击与防御 9.1.1 CSRF简介 9.1.2 CSRF攻击演示 9.1.3 CSRF防御 9.1.4 源码分析 9.2 HTTP响应头处理 9.2.1 缓存控制 9.2.2 X-Content-Type-Options 9.2.3 Strict-Transport-Security 9.2.4 X-Frame-Options 9.2.5 X-XSS-Protection 9.2.6 Content-Security-Policy 9.2.7 Referrer-Policy 9.2.8 Feature-Policy 9.2.9 Clear-Site-Data 9.3 HTTP通信安全 9.3.1 使用HTTPS 9.3.2 代理服务器配置 9.4 小结 第10章 HTTP认证 10.1 HTTP Basic authentication 10.1.1 简介 10.1.2 具体用法 10.1.3 源码分析 10.2 HTTP Digest authentication 10.2.1 简介 10.2.2 具体用法 10.2.3 源码分析
Page
16
10.3 小结 第11章 跨域问题 11.1 什么是CORS 11.2 Spring处理方案 11.2.1 @CrossOrigin 11.2.2 addCorsMappings 11.2.3 CorsFilter 11.3 Spring Security处理方案 11.3.1 特殊处理OPTIONS请求 11.3.2 继续使用CorsFilter 11.3.3 专业解决方案 11.4 小结 第12章 异常处理 12.1 Spring Security异常体系 12.2 ExceptionTranslationFilter原理分析 12.3 自定义异常配置 12.4 小结 第13章 权限管理 13.1 什么是权限管理 13.2 Spring Security权限管理策略 13.3 核心概念 13.3.1 角色与权限 13.3.2 角色继承 13.3.3 两种处理器 13.3.4 前置处理器 13.3.5 后置处理器 13.3.6 权限元数据 13.3.7 权限表达式 13.4 基于URL地址的权限管理 13.4.1 基本用法 13.4.2 角色继承
Page
17
13.4.3 自定义表达式 13.4.4 原理剖析 13.4.5 动态管理权限规则 13.5 基于方法的权限管理 13.5.1 注解介绍 13.5.2 基本用法 13.5.3 原理剖析 13.6 小结 第14章 权限模型 14.1 常见的权限模型 14.2 ACL 14.2.1 ACL权限模型介绍 14.2.2 ACL核心概念介绍 14.2.3 ACL数据库分析 14.2.4 实战 14.3 RBAC 14.3.1 RBAC权限模型介绍 14.3.2 RBAC权限模型分类 14.3.3 RBAC小结 14.4 小结 第15章 OAuth2 15.1 OAuth2简介 15.2 OAuth2四种授权模式 15.2.1 授权码模式 15.2.2 简化模式 15.2.3 密码模式 15.2.4 客户端模式 15.3 Spring Security OAuth2 15.4 GitHub授权登录 15.4.1 准备工作 15.4.2 项目开发
Page
18
15.4.3 测试 15.4.4 原理分析 15.4.5 自定义配置 15.5 授权服务器与资源服务器 15.5.1 项目规划 15.5.2 项目搭建 15.5.3 测试 15.5.4 原理分析 15.5.5 自定义请求 15.6 使用Redis 15.7 客户端信息存入数据库 15.8 使用JWT 15.8.1 JWT 15.8.2 JWT数据格式 15.8.3 OAuth2中使用JWT 15.9 小结
Page
19
第1章 Spring Security架构概览 Spring Security虽然历史悠久,但是从来没有像今天这样受到 开发者这么多的关注。究其原因,还是沾了微服务的光。作为Spring 家族中的一员,在和Spring家族中的其他产品如Spring Boot、 Spring Cloud等进行整合时,Spring Security拥有众多同类型框架 无可比拟的优势。本章我们就先从整体上了解一下Spring Security 及其工作原理。 本章涉及的主要知识点有: · Spring Security简介。 · Spring Security整体架构。 1.1 Spring Security简介 Java企业级开发生态丰富,无论你想做哪方面的功能,都有众多 的框架和工具可供选择,以至于SUN公司在早些年不得不制定了很多 规范,这些规范在今天依然影响着我们的开发,安全领域也是如此。 然而,不同于其他领域,在Java企业级开发中,安全管理方面的框架 非常少,一般来说,主要有三种方案: · Shiro · Spring Security · 开发者自己实现
Page
20
Shiro本身是一个老牌的安全管理框架,有着众多的优点,例如 轻量、简单、易于集成、可以在JavaSE环境中使用等。不过,在微 服务时代,Shiro就显得力不从心了,在微服务面前,它无法充分展 示自己的优势。 也有开发者选择自己实现安全管理,据笔者所知,这一部分人不 在少数。但是一个系统的安全,不仅仅是登录和权限控制这么简单, 我们还要考虑各种各样可能存在的网络攻击以及防御策略,从这个角 度来说,开发者自己实现安全管理也并非是一件容易的事情,只有大 公司才有足够的人力物力去支持这件事情。 Spring Security作为Spring家族的一员,在和Spring家族的其 他成员如Spring Boot、Spring Cloud等进行整合时,具有其他框架 无可比拟的优势,同时对OAuth2有着良好的支持,再加上Spring Cloud 对 Spring Security 的 不 断 加 持 ( 如 推 出 Spring Cloud Security),让Spring Security不知不觉中成为微服务项目的首选 安全管理方案。 陈年旧事 Spring Security最早叫Acegi Security,这个名称并不是说它和 Spring就没有关系,它依然是为Spring框架提供安全支持的。Acegi Security基于Spring,可以帮助我们为项目建立丰富的角色与权限管 理系统。Acegi Security虽然好用,但是最为人诟病的则是它臃肿烦 琐的配置,这一问题最终也遗传给了Spring Security。 Acegi Security最终被并入Spring Security项目中,并于2008 年4月发布了改名后的第一个版本Spring Security 2.0.0,截止本书 写作时,Spring Security的最新版本已经到了5.3.4。 和Shiro相比,Spring Security重量级并且配置烦琐,直至今 天,依然有人以此为理由而拒绝了解Spring Security。其实,自从
The above is a preview of the first 20 pages. Register to read the complete e-book.
Comments 0
Loading comments...
Reply to Comment
Edit Comment