Spring Security 第三版(六)

原文:zh.annas-archive.org/md5/3E3DF87F330D174DBAF9E13DAE6DC0C5

译者:飞龙

协议:CC BY-NC-SA 4.0

第十七章:附加参考资料

在本附录中,我们将介绍一些我们认为有帮助(并且大部分未文档化)但内容过于全面而无法插入各章节的参考资料。

使用 JBCP 日历示例代码开始

正如我们在第一章中描述的,《一个不安全应用程序的剖析》,我们假设你已经安装了一个 JDK。您可以从 Oracle 的网站www.oracle.com/technetwork/java/javase/downloads/index.html下载一个 JDK。为了运行代码示例,你需要安装 JDK 8。代码库使用了许多 JDK 8 的功能,这些功能与 JDK 7 不兼容,而且没有尝试解决 IDE 以及项目依赖项的各种 JDK 9 问题。

Gradle 构建工具

本书中的所有代码都是使用 Gradle 构建工具构建的,并且是按章节组织的多模块构建。您可以在gradle.org/install/找到获取 Gradle 的说明和选项。

由于源代码的根目录已经安装了 Gradle 包装器,因此不需要本地安装 Gradle。Gradle 包装器可以在任何子模块中安装。您可以在docs.gradle.org/current/userguide/gradle_wrapper.html找到有关 Gradle 包装器的更多信息。

下载示例代码

您可以从您在www.packtpub.com购买的所有 Packt 书籍的示例代码文件中下载。如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support并注册,以便将文件直接通过电子邮件发送给您。

Gradle IDE 插件

代码库已经配置了 IntelliJ 和 Eclipse IDE 插件。这意味着 Gradle 可以创建所有必要的 IDE 项目文件,而不是手动导入代码库,尽管你并非强制使用这些插件。

要使用这些插件,请打开一个终端或命令提示符窗口,切换到代码库的根目录。要在 OSX 或 Linux 上执行插件,请发出以下命令:

$ ./gradlew idea

运行此任务后,每个目录中都会有几个 IDEA 项目文件,如下面的屏幕截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果您是在 Windows 机器上,您将发出以下命令:

C:\jbcdcalendar> gradlew.bat idea

之前的示例执行了gradlew脚本,这是 Gradle 包装器,然后给出了创建 IDE 文件的命令。IntelliJ 项目文件是通过idea任务创建的,而 STS 或任何基于 Eclipse 的 IDE 的项目文件是通过 eclipse 任务创建的。

运行 Eclipse 任务后,每个目录中都会有几个 Eclipse 项目文件和目录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

IntelliJ IDEA

本书中使用的大多数图表都来自 Jet Brains 的 IntelliJ IDEA (www.jetbrains.com/idea/). IDEA 对多模块 Gradle 构建提供了很好的支持。

IDEA 将允许你导入一个现有项目,或者你可以简单地从源代码基的根目录打开build.gradle文件,IDEA 将为你创建必要的工作区文件。

一旦你使用 Gradle idea任务创建了 IDEA 项目文件,你就可以使用以下截图所示的导入项目选项来导入整个项目:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,你将被提示选择各种选项,以确定 IDEA 如何执行此 Gradle 构建,如下截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于 IDEA 导入 Gradle 项目的一个特别说明

在前面的列表中,你会注意到有一个使用 Gradle 包装器任务配置的选项,以及被选中的默认 Gradle 包装器(推荐)选项。唯一的区别是使用 Gradle 包装器任务配置选项,这将在每个项目目录中创建一个 Gradle 包装器实例。如果你想在终端或命令行上执行构建命令,又不想安装 Gradle 的本地版本,这将很有帮助。否则,IDEA 为所有项目处理 Gradle 包装器调用。

一旦项目被导入,你将能够使用任何章节进行工作,布局如下截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Spring Tool Suite 或 Eclipse

如果使用 STS,我们假设你有访问Spring Tool Suite (STS) 3.9.1 的权限。你可以从spring.io/tools/sts下载 STS。STS 3.9.1 基于 Eclipse Oxygen 1a (4.7.1a)并且你可以在www.eclipse.org/ide/找到更多关于 Oxygen 版本的详细信息。

创建一个新的工作区

为了最小化与你的环境之间的差异,最好创建一个新的工作区,可以通过执行以下步骤来实现:

  1. 当你第一次打开 STS 时,它会提示你输入工作区位置。如果你之前使用过 STS,你可能需要去文件|切换工作区|其他来创建一个新的工作区。我们建议输入不包含任何空格的工作区位置。例如,请查看以下截图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 一旦你创建了一个新的工作区,你将想要通过点击欢迎标签上的关闭按钮来退出欢迎屏幕,如下截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个示例代码结构

示例代码以.zip文件的形式组织,包含了一个多模块 Gradle 项目的文件夹。每个文件夹都命名为chapterNN,其中NN是章节号。每个chapterNN文件夹还包括了包含每个里程碑项目的文件夹,文件夹格式为chapterNN.mm-calendar,其中NN是章节号,mm是该章节内的里程碑。为了简化操作,我们建议您将源代码解压到一个不包含任何空格的路径。每个里程碑都是章节内的检查点,允许您轻松地将自己的代码与书中的代码进行比较。例如,chapter02.03-calendar包含了第二章,Spring Security 入门,日历应用程序中的里程碑号03。前一个项目的位置将是~/jbcpcalendar/chapter02/chapter02.03-calendar

第一章一个不安全应用程序的剖析和第二章Spring Security 入门作为 Spring IO 项目创建,没有使用 Spring Boot 作为项目基础。第三章自定义认证将日历项目转换为 Spring Boot 代码库,在第五章使用 Spring Data 进行认证中,JDBC 被 Spring Data 作为持久化机制所替代。

为了使每个章节尽可能独立,书中的大部分章节都是基于第九章,开放 OpenID,或第十五章,额外的 Spring Security 特性构建的。这意味着在大多数情况下,您可以阅读第九章,开放 OpenID,然后跳到书的其它部分。然而,这也意味着开始每个章节时,使用章节里程碑00的源代码非常重要,而不是继续使用上一章节的代码。这确保了您的代码从章节开始的地方开始。

虽然您可以在不执行任何步骤的情况下完成整本书,但我们建议您从每个章节的里程碑00开始,并实现书中的步骤。这将确保您能从书中获得最大的收益。您可以使用里程碑版本来复制大量代码,或者在遇到问题时比较您的代码。

导入示例代码

在我们可以将这个 Gradle 项目导入 Eclipse 之前,您必须在 Eclipse 市场安装一个 Gradle 插件。撰写本书时只有两个选项。一个是 Gradle IDE 包(marketplace.eclipse.org/content/gradle-ide-pack),但这个项目没有得到维护,如果您安装这个插件,Eclipse 会警告您,并建议您迁移到Buildship Gradle 集成插件(marketplace.eclipse.org/content/buildship-gradle-integration)。安装后,您将有一个导入现有 Gradle 项目的选项。

从我们全新的工作空间开始,执行以下步骤:

  1. 点击文件|导入,选择现有 Gradle 项目,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 点击下一步>,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 点击下一步>,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

除非你想使用 Gradle 的本地安装,否则请确保保持默认设置。

  1. 浏览您导出代码的位置,并选择代码的父文件夹。您将看到所有项目列表。您可以选择您感兴趣的项目,也可以选择所有项目。如果您决定导入所有项目,您可以轻松地关注当前章节,因为命名约定将确保项目按它们在书中出现的顺序排序:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 点击完成。所选的所有项目将被导入。如果你不经常使用 Gradle,它将需要一点时间来下载你的依赖项。

需要连接互联网以下载依赖项。

每个部分的README.md文件中都可以找到运行项目的更新后的说明。这确保了,即使 STS 进行更新,代码仍然可以使用最新的工具进行构建和运行。

运行示例

为了在 IDEA 或 STS 中运行示例应用程序,需要做一些必要的事情。在所有项目中,Gradle 中已经配置了 Tomcat 插件,以帮助您更快地开始。

在 IDEA 中启动示例

可以通过为每个项目创建运行/调试配置条目来运行里程碑项目。

从我们全新的工作空间开始,执行以下步骤:

  1. 点击文件|运行,选择编辑配置…,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 您将看到添加新配置的选项。在左上角选择加号 (+) 符号来选择一个新的 Gradle 配置,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 现在,您可以给它起一个名字,比如chapter15.00 (bootRun),并选择这个配置的实际里程碑目录。最后,在“任务”选项下输入bootRun以执行,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 选择您想要执行的配置;点击绿色的运行按钮,或者使用以下截图中显示的Shift + F10键:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gradle 任务

在第一章,一个不安全应用程序的剖析,和第二章,Spring Security 入门中,运行项目的 Gradle 任务将是tomcatRun。本书其余章节中,使用了 Spring Boot,并且启动项目的 Gradle 任务将是bootRun

在 STS 中启动示例

在 STS 中,还会创建一个运行配置,每个里程碑项目都需要包含相同的信息,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 STS 中使用 HTTPS

书中某些章节示例代码(即第八章,使用 TLS 的客户端证书认证,第九章,开放到 OAuth2,和第十章,与中央认证服务单点登录)需要使用 HTTPS,以便示例代码能够工作。

所有项目都已配置为运行 HTTPS;大部分配置都在属性文件或 YAML 文件中管理。

现在,当您从 Gradle 在嵌入式 Tomcat 服务器上运行示例代码时,您可以连接到http://localhost:8080https://localhost:8443

Tomcat 中的 HTTPS 设置

在本节中,我们将概述如何在 Tomcat 中设置 HTTPS,以向我们的应用程序提供 TLS。所有包含的项目都在一个内嵌的 Tomcat 实例中运行,但我们还将介绍证书创建过程以及运行这些应用程序在独立的 Tomcat 实例中的一些技巧。

生成服务器证书

如果您还没有证书,您必须首先生成一个。如果您愿意,可以跳过这一步,并使用位于本书示例源代码中etc目录下的tomcat.keystore文件。在命令提示符下输入以下命令行:

$ keytool -genkey -alias jbcpcalendar -keypass changeit -keyalg RSA \
-keystore tomcat.keystore
Enter keystore password: changeit
Re-enter new password: changeitWhat is your first and last name? [Unknown]: localhost
What is the name of your organizational unit? [Unknown]: JBCP Calendar
What is the name of your organization? [Unknown]: JBCP
What is the name of your City or Locality? [Unknown]: Anywhere 
What is the name of your State or Province? [Unknown]: UT
What is the two-letter country code for this unit? [Unknown]: US
Is CN=localhost, OU=JBCP Calendar, O=JBCP, L=Anywhere, ST=UT, C=US correct? [no]: yes

大多数值都是可以自解释的,但您需要确保对“您的名字是什么?”的回答是您将要从哪个主机访问您的网络应用程序。这是确保 SSL 握手成功的必要条件。

现在您应该在当前目录下有一个名为tomcat.keystore的文件。您可以在同一目录下使用以下命令查看其内容:

$ keytool -list -v -keystore tomcat.keystore
Enter keystore password: changeit
Keystore type: JKS
Keystore provider: SUN
...
Alias name: jbcpcalendar
...
Owner: CN=localhost, OU=JBCP Calendar, O=JBCP, L=Anywhere, ST=UT, C=US
Issuer: CN=localhost, OU=JBCP Calendar, O=JBCP, L=Anywhere, ST=UT, C=US

正如您可能已经猜到的那样,使用changeit作为密码是不安全的,因为这是许多 JDK 实现中使用的默认密码。在生产环境中,您应该使用一个安全的密码,而不是像changeit这样简单的东西。

有关keytool命令的额外信息,请参阅在 Oracle 网站上找到的文档docs.oracle.com/javase/9/tools/keytool.htm。如果您遇到问题,您可能还会发现CAS SSL 故障排除和参考指南很有帮助(apereo.github.io/cas/5.1.x/installation/Troubleshooting-Guide.html)。

配置 Tomcat 连接器以使用 SSL

在本节中,我们将讨论如何通过执行以下步骤来配置 Tomcat 8.5 连接器以使用 SSL:

  1. 打开随下载提供的server.xml文件

    Tomcat 8.5。您可以在 Tomcat 服务器的主目录的conf目录中找到此文件。在您的server.xml文件中找到以下条目:

    <!--
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150"    
    scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" />
  1. 取消注释连接器,并将keystoreFile属性的值更改为前一部分中 keystore 的位置。同时,确保更新keystorePass属性的值为您生成 keystore 时使用的密码。以下代码段显示了一个示例,但请确保更新keystoreFilekeystorePass的两个值:
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  maxThreads="150"    
    scheme="https" secure="true" clientAuth="false" sslProtocol="TLS"
    keystoreFile="/home/mickknutson/packt/etc/tomcat.keystore"
    keystorePass="changeit"/>
  1. 现在您应该能够启动 Tomcat 并通过https://locahost:8443/访问它。有关在 Tomcat 上配置 SSL 的更多信息,请参阅tomcat.apache.org/tomcat-8.5-doc/ssl-howto.html上的SSL 配置如何操作

基础 Tomcat SSL 终止指南

本节旨在帮助设置 Tomcat 以在使用 SSL 终止时使用 SSL。想法是外部实体(例如负载均衡器)管理 SSL 连接,而不是 Tomcat。这意味着客户端(即网页浏览器)到负载均衡器的连接通过 HTTPS 并且是安全的。负载均衡器到 Tomcat 的连接通过 HTTP 并且不安全。为了提供任何安全层次,负载均衡器到 Tomcat 的连接应该通过私有网络进行。

这种设置引起的问题是,Tomcat 现在会认为客户端使用 HTTP,因此会发送重定向,就好像有一个 HTTP 连接一样。为了解决这个问题,您可以修改配置,指示 Tomcat 它位于代理服务器后面。

以下示例是一个完整的连接器,将用于使用客户端证书验证的 Tomcat 部署:

    //server.xml

    <Connector
    scheme="https"
    secure="true"
    proxyPort="443"
    proxyHost="example.com"
    port="8443"
    protocol="HTTP/1.1"
    redirectPort="443"
    maxThreads="750"
    connectionTimeout="20000" />

server.xml文件可以在TOMCAT_HOME/conf/server.xml找到。如果您使用 Eclipse 或 Spring Tool Suite 与 Tomcat 交互,您将在包含server.xml文件的Servers项目中找到它。例如,如果您使用 Tomcat 8.5,则在 Eclipse 工作区中的路径可能类似于/Servers/Tomcat v8.5 Serverlocalhost-config/server.xml

请注意,这里没有提到keystore,因为 Tomcat 不管理 SSL 连接。这种设置将重写HttpServletRequest对象,使其相信连接是 HTTPS,从而正确执行重定向。但是,它仍然会接受 HTTP 连接。如果客户端也可以建立 HTTP 连接,可以创建一个单独的连接器-一个不包括 HTTPS 设置的连接器。然后,代理服务器可以根据原始请求是 HTTP 还是 HTTPS,将请求发送到适当的连接器。

更多信息,请参考 Tomcat Proxy How To 文档位于

请参考 tomcat.apache.org/tomcat-8.5-doc/proxy-howto.html。如果你正在处理不同的应用程序,你可以参考他们的文档来了解如何与代理服务器一起工作。

本部分包含了一个列出了书中使用的技术和概念的附加资源列表:

以下是一些 UI 技术:

  • JSP: 您可以在 Oracle 的网站上找到关于 JSPs 的更多信息,网址为javaee.github.io/tutorial/overview008.html#BNACM

  • Thymeleaf: 它是一个现代且吸引人的框架,为 JSPs 提供了极佳的选择。额外的好处是它提供了对 Spring 和 Spring Security 的即开箱支持。您可以在www.thymeleaf.org 找到更多关于 Thymeleaf 的信息。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值