本教程的后面部分提供了对Spring Security框架架构和实现类的深入讨论,当有需要进行一些深度的自定义时可以着重阅读。在这一部分,我们将介绍Spring Security 4.0,简要概述它的历史,并稍微考虑一下如何开始使用框架。此外,我们将看看命名空间配置,它提供了一种比传统的Spring bean方法更简单的保护应用的方法,你再也不必单独连接所有实现类。我们还将查看可用的示例应用程序。尝试运行并实验这部分示例是有价值的,哪怕你阅读到后面的部分了,都可以随时回到此处,因为你对框架的理解在增加,这些示例有助于你对框架得到一个更清晰的认知。
Spring Security为基于Java EE的企业软件应用程序提供全面的安全服务。特别强调支持使用Spring Framework构建的项目,Spring Framework是为企业软件开发的领先的Java EE解决方案。如果你不使用Spring来开发企业应用程序,我们强烈支持你仔细看看它。对Spring的一些熟悉,特别是依赖注入原则,将有助于你更容易地加快学习Spring Security的速度。
人们使用Spring Security有很多原因,但是大多数人在发现Java EE的Servlet规范或EJB规范的安全特性缺乏典型企业应用程序场景所需的深度后,就会被吸引到该框架。虽然提到这些标准,重要的是要认识到它们在WAR或EAR级别不可移植。因此,如果切换服务器环境,通常需要在新目标环境中重新配置应用程序的安全性。使用Spring Security则克服了这些问题,并为你带来了许多其他有用的可自定义的安全功能。
你可能知道应用程序安全性的两个主要领域是“身份验证”和“授权”(或“访问控制”)。这些是Spring Security目标的两个主要领域。“认证”是建立委托人的过程,他们声称是委托人(“委托人”通常是指可以在你的应用程序中执行操作的用户,设备或其他系统)。“授权”是指决定是否允许主体在你的应用程序中执行操作。为了到达需要授权决定的点,认证过程已经建立了主体的身份。这些概念是常见的,而不是特定于Spring Security。
在认证级别,Spring Security支持各种各样的认证模型。这些认证模型中的大多数由第三方提供,或者由诸如因特网工程任务组的相关标准机构开发。此外,Spring Security提供了自己的一组认证功能。具体来说,Spring Security目前支持所有这些技术的身份验证集成:
许多独立软件供应商(ISV)采用Spring Security,因为灵活的认证模型给与他们很大的选择。这样,他们可以快速地将其解决方案与其最终客户所需的任何解决方案集成,而无需进行大量工程或要求客户端更改其环境。如果上述认证机制都不符合你的需求,Spring Security是一个开放平台,它很容易编写自己的认证机制。 Spring Security的许多公司用户需要与不遵循任何特定安全标准的“传统”系统集成,Spring Security很乐意与这样的系统更好地协作。
不考虑认证机制,Spring Security提供了一组深入的授权功能。有三个主要领域 - 授权Web请求,授权是否可以调用方法,以及授权访问单个域对象实例。为了帮助你了解差异,请分别考虑Servlet规范Web模式安全性,EJB容器管理安全性和文件系统安全性中的授权功能。 Spring Security在所有这些重要领域提供了深入的功能,我们将在本教程中探讨。
Spring Security于2003年底开始为“Spring的Acegi安全系统”。在Spring开发者的邮件列表中提出了一个问题,询问是否对基于Spring的安全实现进行了任何考虑。当时Spring社区相对较小(特别是与今天的规模相比),事实上Spring本身只是作为一个SourceForge项目从2003年初开始存在。对这个问题的回答是,这是一个有价值的领域,虽然缺乏的时间目前阻止其探索。考虑到这一点,构建了一个简单的安全实现,而不是发布。几个星期后,Spring社区的另一个成员询问了安全性,并在当时向他们提供了这些代码。其他几个请求,到2004年1月左右,大约二十个人正在使用代码。这些先驱用户加入了其他人,他们建议SourceForge项目顺利,该项目于2004年3月正式成立。在那些早期,该项目没有任何自己的认证模块。集装箱托管安全被依赖于身份验证过程,与Acegi安全,而不是专注于授权。这首先是合适的,但随着越来越多的用户请求额外的容器支持,集装箱特定认证域界面的根本限制变得清楚。还有一个相关的问题,即向容器的类路径添加新的JAR,这是最终用户混淆和配置错误的常见来源。随后引入了Acegi安全特定的身份验证服务。大约一年后,Acegi Security成为了一个官方的Spring Framework子项目。 1.0.0的最终版本于2006年5月发布 - 经过两年半以上的积极使用,许多生产软件项目和数百个改进和社区贡献。 Acegi Security成为2007年年底的官方Spring Portfolio项目,并被重新命名为“Spring Security”。今天Spring Security享有一个强大和活跃的开源社区。在支持论坛上有关于Spring Security的数千条消息。有一个活跃的开发人员核心的工作代码本身和一个活跃的社区,也定期共享补丁和支持他们的同行。
了解Spring Security发行版号码是如何工作的很有用,因为它将帮助你确定迁移到项目的未来版本所涉及的工作(或缺乏)。 每个版本使用标准的三元组整数:MAJOR.MINOR.PATCH。 意图是MAJOR版本不兼容,大规模升级API。 MINOR版本应该在很大程度上保留与旧版本的源和二进制兼容性,认为可能有一些设计更改和不兼容的更新。 PATCH级别应该完全兼容,向前和向后,可能的例外是修复错误和缺陷的更改。 你受更改影响的程度将取决于代码的集成程度。 如果你做了很多定制,你比使用一个简单的命名空间配置更可能受到影响。 你应该在推出新版本之前彻底测试你的应用程序。
你可以通过几种方式掌握Spring Security。 你可以从Spring Security主页下载一个打包的发行版,从Maven Central存储库(或快照和里程碑版本的Spring Maven存储库)下载单个jar,或者,你也可以从源代码构建项目。
最小的Spring Security Maven依赖关系集通常如下所示:
<dependencies>
<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-webartifactId>
<version>4.1.3.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-configartifactId>
<version>4.1.3.RELEASEversion>
dependency>
dependencies>
最小的Spring Security Gradle依赖集通常如下所示:
dependencies {
compile 'org.springframework.security:spring-security-web:4.1.3.RELEASE'
compile 'org.springframework.security:spring-security-config:4.1.3.RELEASE'
}
在Spring Security 3.0中,代码库已经细分为单独的jar,这些jar更清楚地区分不同的功能区域和第三方依赖。 如果你使用Maven构建项目,那么这些是将添加到pom.xml的模块。 即使你不使用Maven,我们建议你参考pom.xml文件,以了解第三方依赖项和版本。 或者,一个好主意是检查包含在示例应用程序中的库。
org.springframework.security.core
org.springframework.security.access
org.springframework.security.authentication
org.springframework.security.provisioning
提供与Spring Remoting的集成。 你不需要这个,除非你正在编写一个使用Spring Remoting的远程客户端。 主包是
* org.springframework.security.remoting
包含过滤器和相关的Web安全基础结构代码。 任何与servlet API依赖关系。 如果你需要Spring Security Web身份验证服务和基于URL的访问控制,你将需要它。 主包是org.springframework.security.web
。
包含安全命名空间解析代码和Java配置代码。 如果你使用Spring Security XML命名空间进行配置或Spring Security的Java配置支持,则需要它。 主包是org.springframework.security.config
。没有一个类用于在应用程序中直接使用
LDAP身份验证和配置代码。 如果需要使用LDAP身份验证或管理LDAP用户条目,则为必需。顶层包是org.springframework.security.ldap
专用域对象ACL实现。 用于对应用程序中的特定域对象实例应用安全性。 顶层包是org.springframework.security.acls
.
Spring Security CAS客户端集成。 如果要将Spring Security Web身份验证与CAS单点登录服务器配合使用。 顶层包是org.springframework.security.cas
。
OpenID Web身份验证支持。 用于根据外部OpenID服务器验证用户。 org.springframework.security.openid。 需要OpenID4Java
为spring security提供测试支持。
由于Spring Security是一个开源项目,我们强烈建议你使用git检查源代码。 这将让你完全访问所有示例应用程序,你可以轻松地构建项目的最新版本。 拥有一个项目的源也是一个巨大的帮助调试。 异常堆栈跟踪不再是晦涩的黑盒问题,但你可以直接定位到导致问题的行,并解决发生了什么。 源代码是项目的最终文档,通常是最简单的地方来了解一些实际工作原理。 要获取项目的源,请使用以下git命令:
git clone https://github.com/spring-projects/spring-security.git
这将允许你访问本地计算机上的整个项目历史记录(包括所有版本和分支)。
在Spring Security 4.1中修复了100多个RC1问题和60个RC2问题。 这里是改进列表:
LogoutConfigurer
协商LogoutSuccessHandler
SessionManagementConfigurer
配置 InvalidSessionStrategy
HttpSecurity.addFilterAt
在链中的特定位置添加过滤器如果你正在寻找怎么开始使用Spring Security,最好的办法是参照下面的官方示例应用程序。
Table 4.1. Sample Applications
Source | Description | Guide |
---|---|---|
Hello Spring Security | Demonstrates how to integrate Spring Security with an existing application using Java-based configuration. | Hello Spring Security Guide |
Hello Spring Security Boot | Demonstrates how to integrate Spring Security with an existing Spring Boot application. | Hello Spring Security Boot Guide |
Hello Spring Security XML | Demonstrates how to integrate Spring Security with an existing application using XML-based configuration. | Hello Spring Security XML Guide |
Hello Spring MVC Security | Demonstrates how to integrate Spring Security with an existing Spring MVC application. | Hello Spring MVC Security Guide |
Custom Login Form | Demonstrates how to create a custom login form. | Custom Login Form Guide |