跳转至

Spring Security实战#

约 5007 个字 2 张图片 预计阅读时间 100 分钟

思维导图#


Spring Security知识点

前言部分#

推荐序#

我是在2022年第一次认识Laurențiu Spilcă 的,当时我们在线上合作准备了一场SpringOne的演讲。2023年在比利时的Devoxx大会上,我终于有机会与他线下见面,这让我非常高兴。当他邀请我为这本书写序时,我感到非常激动。下面,我想先引用书中的一段内容:

错误地应用框架会导致应用程序难以维护。更糟糕的是,有时候那些没有正确使用框架的人还会把问题归咎于框架本身。

这是一条非常重要的信息!多年来,我多次收到社区反馈,说 Spring Security 难以理解,学习曲线陡峭。无论实际情况如何,如果你深入研究这个框架的内部机制,真正掌握其认证架构,你就能学会如何充分利用它的各种功能,最终也会发现它其实并不难用。这本书正是在这一点上做得非常出色,深入剖析了 Spring Security 的认证架构,配以清晰的示意图和详细的讲解,帮助你全面理解认证流程中各个核心组件的协作方式。

在整本书中,Laurențiu 巧妙地运用了类比,帮助简化了所讨论的话题。我特别喜欢他在认证架构部分用到的那个类比,他的总结非常到位:

如果你了解这种架构,你就像一位熟悉所有食材的厨师,能够随心所欲地烹制任何菜肴。

用于演示认证处理流程的协作图非常出色。它以高层次的方式展示了流程,并在全书内容推进的过程中,详细说明了各核心组件的主要职责。内容安排自然流畅,从非常简单的示例逐步过渡到更高级的案例,循序渐进,不会让读者感到负担。

在本书详细探讨了认证架构之后,下一个顺理成章的话题就是授权。这让我想起了社区中经常被提到的一个问题:权限、角色和许可之间有什么区别? 本书对此给出了很好的解答,通过非常简单的现实例子,分别说明了什么是权限角色许可,以及这些概念如何与用户关联 。接下来,书中还介绍了根据系统功能用户类型,在应用中建模权限的一般指导原则。随后,作者结合这些通用原则,演示了如何在 Spring Security 配置中定义授权规则,从而实现访问控制的限制。

第四部分涵盖了 OAuth 2OpenID Connect 1.0 相关主题。我认为可以毫不夸张地说,OAuth 2 和 OpenID Connect 1.0 这一系列规范内容庞杂,对于初学者来说,很难快速理解它们的用途和功能。不过,这本书对规范中定义的核心概念(如角色授权许可类型访问令牌格式等)做了非常出色的高层次梳理,并且详细讲解了这些概念在 Spring SecuritySpring Authorization Server 中的具体实现。我非常喜欢书中用办公楼门禁卡的类比来解释 OAuth 2 规范:就像你需要一张(权限有限的)门禁卡才能进入会议室一样。书中通过这个现实生活中的场景,逐步讲解了 OAuth 2 体系的各个组成部分及其各自扮演的角色。

接下来,它通过一个简单的示例,结合 Spring Authorization Server 以及 Spring Security 的客户端资源服务器 支持,进行演示。示例从最基础的配置开始,逐步展示如何配置客户端以实现不同的授权类型流程,比如授权码(带 PKCE)客户端凭证刷新令牌等。随后,还会演示一些常见的配置场景,例如如何配置不透明令牌使用令牌自省令牌撤销。接下来,内容将进一步深入,介绍 如何为资源服务器配置多租户等更高级的应用场景。

总的来说,这本书是深入了解 Spring Security 认证架构和框架内部机制的必读之作,能够帮助你充分发挥该框架的强大功能。

—— Joe Grandja,Spring Security 工程师,VMware by Broadcom

前言#

软件开发的旅程,就像是一场充满魅力的舞蹈,既有构建、学习,也有教学,甚至时常需要放下旧有认知。从2007年踏入这个领域以来,我的角色也在不断拓展,从单纯的开发者,逐渐成长为开发者兼培训师。虽然这两种身份各有其独特的吸引力,但真正让我充满激情的,是传递知识、激发好奇心,以及见证学员们灵光一现的时刻。当然,开发与培训其实密不可分。想要成为引领他人的“点灯人”,首先自己必须深深扎根于软件应用日新月异的前沿阵地。

多年来,有一个体会格外深刻:虽然软件的功能性是其核心,但安全性、性能和可维护性等非功能属性才是它赖以生存的命脉。发现功能上的小故障相对容易,而要应对安全漏洞或性能瓶颈则如同在迷雾中摸索。难怪无论是经验丰富的开发者还是新手,面对这些非功能性难题时,往往都会感到犹豫和棘手。

在这些因素中,安全不仅至关重要,更是不可或缺。而在众多安全框架中,Spring Security凭借Spring生态系统在企业级应用领域的广泛应用和高度可靠性,成为了业界的佼佼者。然而,摆在我们面前的一个突出难题是——Spring Security的学习曲线异常陡峭。网上的各种资料零散分布,像拼图一样难以拼合成体系,即使是最有毅力的学习者也常常感到无从下手。

正是这些挑战,再加上无数次在咨询中目睹Spring Security被不当甚至极其脆弱地实现,促使我萌生了撰写本书第一版的念头。我的目标很明确:无论你是Spring的新手还是资深爱好者,都能通过本书掌握Spring Security的精髓。

在第二版中,我们深入探讨了 Spring Security,回顾了自第一版以来的创新、变革与实践经验。我们对已有内容进行了完善,从不足之处吸取了教训,并引入了当下不可或缺的新内容。我真诚地希望,这本《Spring Security 实战》第2版不仅仅是一本书,更能成为你在打造安全、健壮应用之路上的得力伙伴。我希望它能成为你开发旅程中的一盏明灯,帮助你节省宝贵时间,并让你在面对数字世界日益变化的安全威胁时,能够自信地构建坚不可摧的应用。

致谢#

本书的创作是一段旅程,若没有众多杰出人士的智慧、支持与专业协助,我无法独自完成。

首先,衷心感谢我的妻子丹妮拉,她是我的指引和灯塔。在整个项目过程中,她的见解、持续的鼓励以及始终如一的信任都起到了至关重要的作用。

Manning 整个团队都值得特别表扬。他们始终如一的投入和奉献,让这本手稿成为了今天这样宝贵的资源。在这里,我尤其要感谢 Marina Micheals 和 Jean-François Morin。他们的专业精神、支持与宝贵建议,为本书增添了许多价值。

特别感谢我的朋友 Ioana Göz,她是这些插画背后的创意天才。她总能把我那些抽象的想法转化为生动有趣的视觉作品,为书中的技术内容增添了独特的魅力,也让读者在阅读过程中不时会心一笑。

本书在众多审阅者的细致审查和宝贵反馈下受益良多。他们敏锐的观察力和建设性的意见对内容的完善起到了至关重要的作用。特别感谢Manning的专职审稿人,以及Amarjit Bhandal、Asif Iqbal、Cosimo Damiano Prete、Geoff Williams、Javid Asgarov、Justin Reiser、Luigi Rubino、Manoj Kumar、Marcus Geselle、Michele Adduci、Mikael Byström、Mikhail Malev、Najeeb Arif、Patrick Wanjau、Richard Meinsen、Sachin Handiekar、Simeon Leyzerzon和Simone Sguazza。同时,也要感谢我值得信赖的朋友们,他们为本书倾注了专业知识与经验。

最后,感谢我在 Endava 的同事和朋友们:你们一直以来的鼓励、真知灼见,以及对我工作的坚定信任,是默默推动我前行的力量。我非常珍视并感激你们的支持。

对于所有以各种方式参与过这个项目的人,无论贡献大小,请相信,正是你们的付出共同编织出了这本书的华美篇章。衷心感谢你们!

关于这本书#

安全性在软件开发中至关重要,从一开始就将其融入开发流程是必不可少的。《Spring Security实战(第二版)》深入讲解了如何利用Spring Security为你的项目注入应用级安全防护。精通Spring Security并正确应用它,是每一位开发者不可或缺的能力。没有这方面的知识就贸然开发应用,无疑是在冒极大的风险。

谁适合阅读本书?#

本书面向使用 Spring 框架进行企业级应用开发的开发者。虽然内容主要为初学 Spring Security 的读者量身打造,但你需要具备 Spring 框架的基本知识,包括:

  • 使用 Spring 上下文
  • 构建 REST 接口
  • 操作数据源

第15章深入探讨了响应式应用的安全配置。因此,提前了解响应式应用及其在Spring中的开发是非常必要的。在阅读本书的过程中,我会为你推荐一些补充资源,以帮助你巩固或初步了解相关主题。

本书中的所有示例均采用 Java 语言。鉴于 Java 在 Spring 生态系统中的广泛应用,本书默认读者已具备一定的 Java 基础。当然,也有不少专业人士会使用如 Kotlin 等其他语言,但其基础原理大致相同。如果需要,书中的示例也可以方便地转换为 Kotlin。

如果你觉得在开始阅读本书之前需要回顾一下相关的基础知识,我诚挚推荐你阅读我写的另一本书《Spring Start Here》(Manning, 2021)

本书结构一览:导读#

我撰写这本书,是希望能够带领你全面了解 Spring Security,从基础概念到更高级的内容,循序渐进地展开。全书各部分环环相扣,帮助你系统、深入地掌握相关知识。下面是本书的简要结构:

  • 第一部分:初识 Spring Security: 在本部分,我将带你了解当今安全领域的最新格局以及 Spring Security。我们将从安全在数字时代中的核心地位谈起,探讨 Spring Security 如何应对这些挑战,为后续内容打下坚实基础。

  • 第二部分:配置认证: 深入剖析认证机制。我会详细讲解用户管理、密码规范、过滤器在 Web 应用安全中的关键作用,以及认证的具体实现方式。

  • 第三部分:配置授权: 我们将从认证过渡到授权。一起探索端点级别的授权、防御 CSRF 等安全威胁的措施、CORS 管理,并深入讲解方法级别的复杂授权与过滤。

  • 第四部分:实现 OAuth 2 和 OpenID Connect: 本部分将带你全面了解 OAuth 2 和 OpenID Connect 的世界。你将学习它们的重要性,并掌握 OAuth 2 服务器、资源服务器和客户端的搭建,从而全面提升应用安全性。

  • 第五部分:走向响应式: 在这里,我将介绍响应式编程范式,并详细讲解如何保障响应式应用的安全,确保你的异步操作同样坚不可摧。

  • 第六部分:测试安全配置: 我会强调上线前安全测试的重要性。我们将深入探讨各种测试方法,确保你的安全配置能够精准无误地发挥作用。

  • 附录: 附录部分包含官方文档资源及延伸阅读,助你进一步学习和探索。

虽然我将本书设计为一步步引导的学习旅程,但对于已经有一定 Spring Security 基础的读者来说,可以直接跳转到自己感兴趣的章节。不过需要注意,后面的章节可能会引用前面部分的相关概念。如果你已经熟悉了 Spring Security 的基础内容,可以从第三部分或第四部分开始,深入了解 OAuth 2 和 OpenID。如果你对响应式编程感兴趣,也可以直接阅读第五部分。无论你选择从哪里开始,都建议你认真理解每一个概念,这样才能更好地掌握后续章节的内容。

关于代码#

本书提供了70多个项目,我们将从第2章一直到第18章逐步实践。在讲解具体示例时,我会提到实现该示例的项目名称。我的建议是,你可以结合书中的讲解,自己从零开始编写示例代码,然后再用书中提供的项目与自己的实现进行对比。这样做有助于你更深入地理解所学的安全配置内容。

每个项目都是用 Maven 构建的,因此可以轻松导入到任何 IDE 中。我本人使用 IntelliJ IDEA 编写这些项目,但你也可以选择在 Eclipse、STS、NetBeans 或其他你喜欢的开发工具中运行它们。附录部分还可以帮助你回顾如何创建一个 Spring Boot 项目。

本书包含了大量源代码示例,既有编号的代码清单,也有直接嵌入正文的代码片段。无论哪种情况,源代码都会采用类似这样的等宽字体进行排版,以便与普通文本区分开来。在许多情况下,原始源代码经过了重新排版;我们根据书中页面的空间,增加了换行并调整了缩进。极少数情况下,即使这样也无法完全展示,代码清单中还会加入行续标记(➥)。此外,当代码在正文中已有详细说明时,代码清单中的注释通常会被省略。许多代码清单还配有注释,突出展示重要的概念。

您可以在本书的 liveBook(在线)版本获取可直接运行的代码片段。本书中所有示例的完整代码可在 Manning 官网 下载。

liveBook 讨论论坛#

购买《Spring Security实战(第二版)》即可免费获得Manning在线阅读平台liveBook的访问权限。通过liveBook独有的讨论功能,您可以在全书范围内,或针对特定章节和段落添加评论。无论是做个人笔记、提出和解答技术问题,还是向作者及其他用户寻求帮助,都非常方便。访问论坛请前往:https://livebook.manning.com/book/spring-security-in-action-second-edition/discussion。您还可以在https://livebook.manning.com/discussion了解更多关于Manning论坛及行为规范的信息。

Manning承诺为读者提供一个平台,让读者之间以及读者与作者之间能够进行有意义的交流。需要注意的是,这并不意味着作者必须参与特定数量的讨论,作者在论坛中的参与完全是自愿的(且不收取报酬)。我们建议你可以向作者提出一些有挑战性的问题,以激发他们的兴趣!只要本书仍在出版,论坛及以往讨论的存档都可以通过出版社网站访问。

关于作者#

Laurențiu Spilcă 自 2007 年以来一直是一名经验丰富的软件开发者和培训师,目前担任 Endava 的首席开发顾问。在这个职位上,他主导了多个全球知名项目,这些项目已在世界各地成功部署。Laurențiu 始终怀揣着两大热情:打造一流的软件产品,以及将自己的知识传授给其他开发者。

在他的职业生涯中,Laurențiu始终坚信,软件开发不仅仅是打造高质量的产品,更重要的是营造知识共享和持续学习的文化。正是基于这一信念,他设计并主导了以Java技术为核心的课程。过去十年里,他已经为三千多名学生传授了相关知识,并积极参与布加勒斯特大学数学与信息学学院的课程教学。

除了在课堂上的贡献之外,Laurențiu 还是一位备受认可的作者。他著有三本在 Java 领域具有重要影响力的书籍:《Spring Security 实战》、《Spring 入门指南》和《Java 故障排查》。这些著作充分体现了他在传播知识、帮助大家深入理解 Java 及其相关技术方面的执着与热情。

他致力于在全球范围内分享见解。从纽约和旧金山的街头,到华沙、贝尔格莱德和柏林的历史场馆,Laurențiu 曾在这些地方为国际观众带来过精彩的演讲、教程和工作坊,广受好评。

为了让知识更广泛地传播,Laurențiu 还创建了一个专注于 Java 及其相关技术的 YouTube 频道(youtube.com/@laurspilca)。在这个平台上,无论是初学者还是有经验的开发者,都可以深入学习丰富多样的话题,而所有内容都由 Laurențiu 以其一贯清晰的风格精心呈现。

在工作之余,Laurenţiu 的兴趣广泛,涵盖了旅行、音乐以及令人着迷的深潜世界。无论是在海洋深处遨游,还是在代码的复杂逻辑中穿梭,Laurenţiu 的旅程都展现了他对探索与发现的热情。

Twitter/X handle: @laurspilca

关于技术编辑#

Jean-François Morin 是加拿大魁北克市拉瓦尔大学的高级 Java 开发人员兼架构师。他拥有数学学士学位、计算机科学硕士学位,以及包括 Java SE 17 开发者和 JAVA EE 6 企业架构师在内的六项 Sun/Oracle Java 认证。他还是一位经验丰富的 Java 讲师,并且是 Manning 出版社的常驻合作者。

关于封面插图#

《Spring Security实战(第二版)》封面上的人物被标注为“Murcie男子”(法语原文为“Homme de Murcie”),取自雅克·格拉塞·德·圣索沃(Jacques Grasset de Saint-Sauveur)于1797年出版的插画集。每一幅插画都经过精细的手工绘制和上色。

在那个年代,人们只需看一眼对方的穿着,就能轻松判断他们的居住地以及从事的职业或社会地位。Manning 出版社以数百年前各地丰富多彩的地域文化为灵感,借助诸如此类馆藏中的图片,将这些文化重新呈现于世,并以此为计算机行业的创新精神和进取心设计书籍封面。


封面插图

评论