Spring Security实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-23 09:10:53

点击下载

作者:陈木鑫

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Spring Security实战

Spring Security实战试读:

前言

技术栈,包括但不限于前后端技术、DevOps、Serverless等,近期主要从事IM平台的研发。作者公众号 欢迎订阅Spring Security实战陈木鑫◎编著电子工业出版社Publishing House of Electronics Industry北京·BEIJING内容简介

Spring Security是一个强大且高度可定制的安全框架,致力于为Java应用提供身份认证和授权。

本书通过4部分内容由浅入深地介绍了Spring Security的方方面面。第1部分主要讲解Spring Security的基本配置;第2部分剖析Web项目可能遇到的安全问题,并讲解如何使用Spring Security进行有效防护;第3部分详细介绍OAuth,并使用Spring Social整合Spring Security,实现QQ快捷登录;第4部分重点介绍Spring Security OAuth框架,剖析Spring Security OAuth的部分核心源码。

本书适合有一定Java基础的读者,以及希望在项目中应用Spring Security的开发人员阅读。

未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。

版权所有,侵权必究。

图书在版编目(CIP)数据

Spring Security实战/陈木鑫编著.—北京:电子工业出版社,2019.8

ISBN 978-7-121-37143-1

Ⅰ.①S… Ⅱ.①陈… Ⅲ.①JAVA语言—程序设计 Ⅳ.①TP312.8

中国版本图书馆CIP数据核字(2019)第152390号

责任编辑:安娜

印刷:

装订:

出版发行:电子工业出版社 北京市海淀区万寿路173信箱

邮编:100036

开本:787×980 1/16

印张:17.75

字数:348千字

版次:2019年8月第1版

印次:2019年8月第1次印刷

定价:79.00元

凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联系及邮购电话:(010)88254888,88258888。

质量投诉请发邮件至zlts@phei.com.cn,盗版侵权举报请发邮件至dbqq@phei.com.cn。

本书咨询联系方式:010-51260888-819,faq@phei.com.cn。前言

Spring Security 的前身是 Acegi Security,在被收纳为Spring 子项目后正式更名为Spring Security。在笔者成书时,Spring Security已经升级到5.1.3.RELEASE版本,不仅新增了原生OAuth框架,还支持更加现代化的密码加密方式。可以预见,在 Java 应用安全领域,Spring Security会成为首先被推崇的安全解决方案。

虽然Spring Security有强大的功能,但它同时也有很高的学习成本。它囊括了身份认证的各种应用场景以及Web安全的大量知识,仅官方参考手册就有数十万字,并且还省略了诸多实现细节。许多开发人员在面对这样的“庞然大物”时无从入手,更因为对其不够了解而在实际项目中不敢轻易采用。

本书由浅入深、抽丝剥茧地讲解了Spring Security的典型应用场景,另外,还分析了部分核心源码,以及许多开发语言之外的安全知识。通过本书,读者不仅可以学习如何应用 Spring Security,还可以学习借鉴它的实现思路,以将这种实现思路应用到其他开发场景中。

本书读者

本书主要面向有一定Java基础的读者,以及希望在实际项目中应用Spring Security的开发人员。

本书内容

本书共分为4个部分。

第1部分(第1章至第3章)主要介绍Spring Security的基本配置,包括默认配置、简单表单认证,以及基于数据库模型的认证与授权。

第2部分(第4章至第11章)主要介绍各种定制化的配置场景,剖析Web项目可能遇到的安全问题,并讲解如何使用Spring Security进行有效防护,部分章节还配备了详细的源码导读。

第3部分(第13章)将登录用户的数据来源从系统内转移到社交平台,详细介绍了OAuth,并使用Spring Social整合Spring Security,实现QQ快捷登录,满足一般性的项目需求。

第4部分(第14章)带领读者认识Spring Security OAuth框架,并基于该框架完整实现了OAuth客户端、OAuth授权服务器以及OAuth资源服务器三种角色。除此之外,还简单剖析了Spring Security OAuth的部分核心源码,以帮助读者更好地理解OAuth框架。

致谢

首先感谢赵召同学(Andy)对第4部分的贡献。笔者在Gitter发言表明会写一本关于Spring Security的中文书后,赵召同学找到了我,并希望与我一起写作,但由于这本书实际上已基本成型,所以赵召同学贡献了第4部分,使得本书内容更加充实,再次感谢赵召同学的贡献。

其次也非常感谢博文视点公司的安娜编辑以及身边的朋友给予的鼓励。从下定决心编写这本书开始,笔者其实经历了非常多的折磨,不管是思路的枯竭还是耐心的消磨,都致使笔者几次三番萌生退意,但最终还是在不断的鼓励声中坚持了下来,成功为国内希望学习 Spring Security的朋友奉上了一本中文版的教程,这份收获也应当属于他们。陈木鑫

读者服务

轻松注册成为博文视点社区用户(www.broadview.com.cn),扫码直达本书页面。

◎ 提交勘误:您对书中内容的修改意见可在【提交勘误】处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。

◎ 与读者交流:在页面下方【读者评论】处留下您的疑问或观点,与其他读者一同学习交流。

页面入口:http://www.broadview.com.cn/37143第1部分第1章 初识Spring Security

本书所有的示例都基于 Intellij IDEA 创建的 Spring Boot 项目,因此读者需要具备一定的Spring相关知识。1.1 Spring Security简介

Spring Security 的前身是 Acegi Security,在被收纳为Spring 子项目后正式更名为Spring Security。

在笔者成书时,Spring Security已经升级到5.1.3.RELEASE版本,加入了原生OAuth2.0框架,支持更加现代化的密码加密方式。可以预见,在Java应用安全领域,Spring Security会成为被首先推崇的解决方案,就像我们看到服务器就会联想到Linux一样顺理成章。

应用程序的安全性通常体现在两个方面:认证和授权。

认证是确认某主体在某系统中是否合法、可用的过程。这里的主体既可以是登录系统的用户,也可以是接入的设备或者其他系统。

授权是指当主体通过认证之后,是否允许其执行某项操作的过程。

这些概念并非Spring Security独有,而是应用安全的基本关注点。Spring Security可以帮助我们更便捷地完成认证和授权。

Spring Security 支持广泛的认证技术,这些认证技术大多由第三方或相关标准组织开发。Spring Security已经集成的认证技术如下:

◎ HTTP BASIC authentication headers:一个基于IETF RFC的标准。

◎ HTTP Digest authentication headers:一个基于IETF RFC的标准。

◎ HTTP X.509 client certificate exchange:一个基于IETF RFC的标准。

◎ LDAP:一种常见的跨平台身份验证方式。

◎ Form-based authentication:用于简单的用户界面需求。

◎ OpenID authentication:一种去中心化的身份认证方式。

◎ Authentication based on pre-established request headers:类似于 Computer Associates SiteMinder,一种用户身份验证及授权的集中式安全基础方案。

◎ Jasig Central Authentication Service:单点登录方案。

◎ Transparent authentication context propagation for Remote Method Invocation(RMI)and HttpInvoker:一个Spring远程调用协议。

◎ Automatic "remember-me" authentication:允许在指定到期时间前自行重新登录系统。

◎ Anonymous authentication:允许匿名用户使用特定的身份安全访问资源。

◎ Run-as authentication:允许在一个会话中变换用户身份的机制。

◎ Java Authentication and Authorization Service:JAAS,Java验证和授权API。

◎ Java EE container authentication:允许系统继续使用容器管理这种身份验证方式。

◎ Kerberos:一种使用对称密钥机制,允许客户端与服务器相互确认身份的认证协议。

除此之外,Spring Security还引入了一些第三方包,用于支持更多的认证技术,如JOSSO等。如果所有这些技术都无法满足需求,则Spring Security允许我们编写自己的认证技术。因此,在绝大部分情况下,当我们有Java应用安全方面的需求时,选择Spring Security往往是正确而有效的。

Internet工程任务组(Internet Engineering Task Force,IETF)是推动Internet标准规范制定的最主要的组织。请求注解(Request For Comments,RFC)包含大多数关于Internet的重要文字资料,被称为“网络知识圣经”。

在授权上,Spring Security不仅支持基于URL对Web的请求授权,还支持方法访问授权、对象访问授权等,基本涵盖常见的大部分授权场景。

很多时候,一个系统的安全性完全取决于系统开发人员的安全意识。例如,在我们从未听过SQL注入时,如何意识到要对SQL注入做防护?关于Web系统安全的攻击方式非常多,诸如 XSS、CSRF 等,未来还会暴露出更多的攻击方式,我们只有在充分了解其攻击原理后,才能提出完善而有效的防护策略。在笔者看来,学习Spring Security并非局限于降低Java应用的安全开发成本,通过Spring Security了解常见的安全攻击手段以及对应的防护方法也尤为重要,这些是脱离具体开发语言而存在的。1.2 创建一个简单的Spring Security项目

本节创建一个简单的Spring Security项目,带领大家初步领略Spring Security带来的便利。下面我们就完整地“走”一遍创建项目的流程。

通过Intellij IDEA创建Spring Boot项目的方式有许多种,其中最简单的方式就是使用Spring Initializr工具,省略了在https://start.spring.io中生成并导入Intellij IDEA的过程。Eclipse也提供了一个可以实现类似功能的插件:STS(Spring Tool Suite),感兴趣的读者可以自行了解。此处我们单击“Next”按钮进入下一个页面,如图1-1所示。图1-1

在图1-2所示页面中,除可以设置项目的Group、Artifact这些基本信息外,还有其他几个配置可选。例如,对于Type属性,可以选择Maven Project或者Gradle Project作为项目管理工具;对于Language属性,可以选择使用Java、Kotlin或Groovy作为开发语言。图1-2

Spring Initializr将根据我们的选择自动构建项目骨架,选好之后单击“Next”按钮进入下一个页面,如图1-3所示。图1-3

Spring Initializr 允许我们提前选定一些常用的项目依赖,此处我们选择 Security 作为构建Spring Security项目的最小依赖,选择Web作为Spring Boot构建Web应用的核心依赖。

当项目创建完成后,可以得到如图1-4所示的目录结构。图1-4

打开pom.xml文件,看看Spring Initializr引入了哪些依赖。

从代码中可以看到,在选择Security之后,Spring Initializr自动引入spring-security-web和spring-security-config两个核心模块,这正是官方建议引入的Spring Security最小依赖。当需要引入更多的Spring Security特征时,再编辑pom.xml文件即可。如果不通过Spring Initializr添加Spring Security的相关依赖,则手动将依赖信息添加到pom.xml文件也是可以的。

同理,通过Gradle管理的项目只需引入spring-security-web和spring-security-config两个核心模块。

下面打开程序的入口类SpringDemoApplication,声明一个hello路由。

首先选中 SpringDemoApplication 类并单击运行项(如果没有出现运行项,则可能是因为Maven没有初始化。选中pom.xml,单击右键,从右键快捷菜单中选择Add as maven build file选项,重新构建即可)。在默认情况下,项目将成功启动并监听8080端口。如果运行失败,则可能是因为8080端口被占用。

接着打开浏览器访问 localhost:8080,浏览器将弹出一个需要进行身份验证的对话框,如图1-5所示。图1-5

在引入Spring Security项目之后,虽然没有进行任何相关的配置或编码,但Spring Security有一个默认的运行状态,要求在经过HTTP基本认证后才能访问对应的URL资源,其默认使用的用户名为user,密码则是动态生成并打印到控制台的一串随机码。翻看控制台的打印信息,可以看到如图1-6所示的输出。图1-6

输入用户名和密码后,单击“登录”按钮即可成功访问hello页面,如图1-7所示。图1-7

当然,右HTTP基本认证中,用户名和密码都是可以配置的,最常见的就是在resources下的配置文件中修改,如图1-8所示。图1-8

打开application.properties,输入以下配置信息:

重新启动程序,发现控制台不再打印默认密码串了,此时使用我们自定义的用户名和密码即可登录。

事实上,绝大部分Web应用都不会选择HTTP基本认证这种认证方式,除安全性差、无法携带cookie等因素外,灵活性不足也是它的一个主要缺点。通常大家更愿意选择表单认证,自己实现表单登录页和验证逻辑,从而提高安全性。第2章 表单认证

在第1章中,我们初步引入了Spring Security,并使用其默认生效的HTTP基本认证来保护URL资源,本章我们使用表单认证来保护URL资源。2.1 默认表单认证

首先,新建一个configuration包用于存放通用配置;然后,新建一个WebSecurityConfig类,使其继承WebSecurityConfigurerAdapter,如图2-1所示。图2-1

在给WebSecutiryConfig类中加上@EnableWebSecurity 注解后,便会自动被 Spring发现并注册(查看@EnableWebSecurity 即可看到@Configuration 注解已经存在,所以此处不需要额外添加)。

接着查看WebSecurityConfigurerAdapter类对configure(HttpSecurity http)的定义。

可以看到WebSecurityConfigurerAdapter已经默认声明了一些安全特性:

◎ 验证所有请求。

◎ 允许用户使用表单登录进行身份验证(Spring Security 提供了一个简单的表单登录页面)。

◎ 允许用户使用HTTP 基本认证。

现在重启服务,应用新的安全配置。可以预见,在下次访问localhost:8080时,系统会要求我们进行表单认证。

结果很意外,无论怎么刷新,都无法看到表单登录页,为什么呢?我们可以从浏览器的开发者工具中找到蛛丝马迹(在Chrome浏览器中可以按快捷键F12调出开发者工具),如图2-2所示。

可以清楚地看到,浏览器发出的请求头中自动携带Authorization属性,由于Spring Security的配置刚好同时支持HTTP基本认证,所以并不需要在表单中重新登录。

这实际上属于浏览器的默认行为,只要在HTTP基本认证中成功认证过,便会自动记住一段时间,也就是说,可以跳过登录直接访问系统资源。那么如何避免这种情况的发生呢?在IE浏览器中,可以在控制台执行 document.execCommand("ClearAuthenticationCache")语句清除HTTP基本认证缓存,但这种方法在Chrome浏览器中并不适用。建议调试时直接使用浏览器的无痕模式,简单方便,可以避免很多缓存问题(在Windows下的Chrome浏览器中,可用组合键 Ctrl+Shift+n 打开浏览器的无痕模式;在 mac 下的 Chrome 浏览器中,可用组合键Command+Shift+n打开浏览器的无痕模式)。

经过一些小插曲,我们终于成功进入表单登录页,如图2-3所示。图2-2图2-3

从图2-3中的地址栏可以发现,我们访问的地址自动跳转到 localhost:8080/login,这正是Spring Security的默认登录页,只要输入正确的用户名和密码便可跳转回原访问地址。2.2 自定义表单登录页

1.初步配置自定义表单登录页

虽然自动生成的表单登录页可以方便、快速地启动,但是大多数应用程序更希望提供自己的表单登录页,此时就需要覆写configure方法。

2.认识HttpSecurity

HttpSecurity实际上对应了=Spring Security命名空间配置方式中XML文件内的标签,允许我们为特定的HTTP请求配置安全策略。

在XML文件中,声明大量配置早已司空见惯;但在Java配置中,按照传统的方式,我们需要这样来调用。

可以想象出这是多么烦琐且令人痛苦的一件事。HttpSecurity首先被设计为链式调用,在执行每个方法后,都会返回一个预期的上下文,便于连续调用。我们不需要关心每个方法究竟返回了什么、如何进行下一个配置等细节。

HttpSecurity提供了很多配置相关的方法,分别对应命名空间配置中的子标签。例如,authorizeRequests()、formLogin()、httpBasic()和 csrf()分别对应标签。调用这些方法之后,除非使用and()方法结束当前标签,上下文才会回到HttpSecurity,否则链式调用的上下文将自动进入对应标签域。

authorizeRequests()方法实际上返回了一个 URL 拦截注册器,我们可以调用它提供的anyanyRequest()、antMatchers()和regexMatchers()等方法来匹配系统的URL,并为其指定安全策略。

formLogin()方法和httpBasic()方法都声明了需要Spring Security提供的表单认证方式,分别返回对应的配置器。其中,formLogin().loginPage("/myLogin.html")指定自定义的登录页/myLogin.html,同时,Spring Security会用/myLogin.html注册一个POST路由,用于接收登录请求。

csrf()方法是Spring Security提供的跨站请求伪造防护功能,当我们继承WebSecurityConfigurer Adapter时会默认开启csrf()方法。关于csrf()方法的更多内容会在后面的章节专门探讨,以使测试进程更加顺利。

重新启动服务后再次访问localhost:8080,页面会自动跳转到localhost:8080/myLogin.html。由于/myLogin.html无法定位到页面资源,所以会显示一个404页面,如图2-4所示。图2-4

3.编写表单登录页

表单登录页的代码如下所示。

myLogin.html是开源模板,这里仅对其进行一些简单修改。因为篇幅有限,所以CSS样式部分已被截取。

在表单登录页中,仅有一个表单,用户名和密码分别为username和password,并以POST的方式提交到/myLogin.html。

我们将其命名为myLogin.html,放置在 resources/static/下。重启服务,再次访问localhost:8080,即可看到自定义的表单登录页,如图2-5所示。图2-5

输入正确的用户名和密码后,单击“Login”按钮,即可成功跳转。

4.其他表单配置项

在自定义表单登录页之后,处理登录请求的URL也会相应改变。如何自定义URL呢?很简单,Spring Security在表单定制里提供了相应的支持。

此时,有些读者可能会有疑问,因为按照惯例,在发送登录请求并认证成功之后,页面会跳转回原访问页。在某些系统中的确是跳转回原访问页的,但在部分前后端完全分离、仅靠JSON完成所有交互的系统中,一般会在登录时返回一段 JSON 数据,告知前端成功登录成功与否,由前端决定如何处理后续逻辑,而非由服务器主动执行页面跳转。这在Spring Security中同样可以实现。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载