Spring Security 为基于 Java EE 的企业软件应用提供全面的安全服务。特别强调支持使用 Spring Framework 构建的项目,Spring Framework 是企业软件开发的领先 JavaEE 解决方案。如果你不使用 Spring 开发企业应用程序,我们热忱地鼓励你仔细研究它。对 Spring 的一些熟悉 —— 尤其是依赖注入原则 —— 将帮助你更容易地快速掌握 Spring Security。 人们使用 Spring Security 的原因有很多,但是大多数都是在发现 JavaEE Servlet 规范或 EJB 规范的安全特性缺乏典型企业应用场景所需的深度之后才吸引到该项目的。在提到这些标准时,重要的是要认识到它们在 WAR 或 EAR 层面是不可移植的。因此,如果切换服务器环境,在新的目标环境中重新配置应用程序的安全性通常需要做大量的工作。使用 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 年底,"The Acegi Security System for Spring"。在 Spring 开发者的邮件列表中提出了一个问题,询问是否考虑过基于 Spring 的安全实现。当时 Spring 社区相对较小(特别是与今天的大小相比)。事实上,2003 年初,Spring 项目本身就只是 SourceForge 项目。对这个问题的反应是,这是一个值得考虑的领域,尽管目前缺乏时间阻碍了它的探索。 考虑到这一点,构建了一个简单的安全实现,但并没有发布。几周后,Spring 社区的另一位成员询问了安全问题,当时向他们提供了代码。随后还有几项要求,到2004年1月为止,大约有二十人在使用代码。其他一些用户也加入了这些先锋用户,他们建议正常进行一个 SourceForge 项目,该项目于2004年3月正式建立。 在早期,项目没有任何自己的身份验证模块。容器管理安全依赖于身份验证过程,而 Acegi 安全性则侧重于授权。这起初是适合的,但是随着越来越多的用户请求额外的容器支持,容器特定的身份验证领域接口的基本限制变得清晰。还有一个相关的问题就是向容器的类路径添加新的 JAR,这是最终用户混淆和错误配置的常见根源。 Acegi 安全专用的身份验证服务随后被提出。大约一年后,Acegi Security 成为一个官方的 Spring Framework 子项目。1.0.0 最终版本是在2006年5月发布的,经过两年半的积极使用,在许多生产软件项目和数百个改进和社区贡献之后。 Aceci Security 在2007年底成为一个官方的 Spring Portfolio 项目,并被重新命名为 Spring Security。 今天,Spring Security 拥有一个强大而活跃的开源社区。在支持论坛上有数以千计的关于 Spring Security 的消息。有一个积极的核心开发者,他们的工作是代码本身,以及一个积极的社区,也定期共享补丁并同样支持它们。 理解 Spring Security 发行编号是如何工作的很有用,因为它将帮助你意识在迁移到项目的未来发行版中所付出的努力(或缺乏的)。每个版本使用一个标准的三重整数:MAJOR.MINOR.PATCH。这个含义是 MAJOR 版本是不兼容的,大规模升级的 API。MINOR 版本应该在很大程度上保留与旧版本的源和二进制兼容性,尽管可能有一些设计更改和不兼容的更新。PATCH 级别应该完全兼容,向前和向后,除了修复 bug 和缺陷的更改之外。 变化的影响程度取决于代码的集成程度。如果你正在进行大量定制,则比使用简单命名空间配置更容易受到影响。 在推出新版本之前,应始终对应用程序进行彻底测试。 你可以用几个方法获得 Spring Security。你可以从 http://springio/spring-security [Spring Security] 页面下载打包的发行版。从 Maven Central 仓库(或用于快照和里程碑发布的 Spring Maven 仓库)下载单个jar,或者你也可以自己从源代码构建项目。 一个最小的 Spring Security Maven 依赖集通常看起来如下: pom.xml. <dependencies> <!-- ... other dependency elements ... --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>5.1.0.BUILD-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>5.1.0.BUILD-SNAPSHOT</version> </dependency> </dependencies> 如果你使用的是 LDAP、OpenID 等其它特性,则还需要包含适当的 小节 2.4.3, “项目模块”。 所有 GA 发行版(即,以 .RELEASE 结尾的版本)都部署到 Maven Central,因此不需要在 pom 中声明额外的 Maven 仓库。 如果你正在使用 SNAPSHOT 版本,则需要确保你具有如下的 Spring Snapshot 仓库定义: pom.xml. <repositories> <!-- ... possibly other repository elements ... --> <repository> <id>spring-snapshot</id> <name>Spring Snapshot Repository</name> <url>http://repo.spring.io/snapshot</url> </repository> </repositories> 如果你使用的是里程碑版本或发布候选版本,则需要确保你具有如下所示的 Spring Milestone 仓库: pom.xml. <repositories> <!-- ... possibly other repository elements ... --> <repository> <id>spring-milestone</id> <name>Spring Milestone Repository</name> <url>http://repo.spring.io/milestone</url> </repository> </repositories> Spring Security 是针对 Spring Framework 5.1.0.RC2 构建的,但是应该与 5 一起工作。许多用户会遇到的问题是,Spring Security 的传递依赖关系解决了 Spring Framework 5.1.0.RC2,这会导致奇怪的类路径问题。
绕过这个问题的一种(乏味的)方法是将所有 Spring Framework 模块包括在 pom 的 <dependencyManagement> 部分中。另一种方法是在 pom.xml. <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>5.1.0.RC2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 这将确保 Spring Security 的所有传递依赖性都使用 Spring 5.1.0.RC2 模块。
一个最小的 Spring Security Gradle 依赖集通常看起来如下: build.gradle. dependencies { compile 'org.springframework.security:spring-security-web:5.1.0.BUILD-SNAPSHOT' compile 'org.springframework.security:spring-security-config:5.1.0.BUILD-SNAPSHOT' } 如果你使用的是 LDAP、OpenID 等其它特性,则还需要包含适当的 小节 2.4.3, “项目模块”。 所有 GA 发行版(即,以 .RELEASE 结尾的版本)都部署到 Maven Central,因此不需要在 pom 中声明额外的 Maven 仓库。 build.gradle. repositories { mavenCentral() } 如果你正在使用 SNAPSHOT 版本,则需要确保你具有如下的 Spring Snapshot 仓库定义: build.gradle. repositories {
maven { url 'https://repo.spring.io/snapshot' }
}
如果你使用的是里程碑版本或发布候选版本,则需要确保你具有如下所示的 Spring Milestone 仓库: build.gradle. repositories {
maven { url 'https://repo.spring.io/milestone' }
}
默认情况下,Gradle 将在解决传递版本时使用最新版本。这意味着当使用 Spring Framework 5.1.0.RC2 运行 Spring Security 5.1.0.BUILD-SNAPSHOT 时,通常不需要额外的工作。然而,有时可能会出现问题,因此最好使用 Gradle 的 ResolutionStrategy 来减轻这种情况,如下所示: build.gradle. configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.group == 'org.springframework') { details.useVersion '5.1.0.RC2' } } } 这将确保 Spring Security 的所有传递依赖性都使用 Spring 5.1.0.RC2 模块。
在 Spring Security 3.0 中,代码库被细分为独立的 jar,这些 jar 可以更清楚地区分不同的功能区域和第三方依赖性。如果你正在使用 Maven 构建项目,那么这些模块将添加到你的 包含核心身份验证和访问控制类和接口、远程处理支持和基本配置 API。使用 Spring Security 的任何应用程序都需要。支持独立应用程序、远程客户端、方法(服务层)安全性和 JDBC 用户配置。包含顶级包:
提供与 Spring Remoting 的整合。你不需要这个,除非你正在编写使用 Spring Remoting 的远程客户端。主包是
包含过滤器和相关的 web 安全基础结构代码。具有 servlet API 依赖项的任何内容。如果需要 Spring Security web 身份验证服务和基于 URL 的访问控制,则需要它。主要的包是
包含安全命名空间解析代码和 Java 配置代码。如果使用 Spring Security XML 命名空间进行配置或 Spring Security 的 Java 配置支持,则需要它。主包是
LDAP 身份验证和提供代码。如果需要使用 LDAP 身份验证或管理 LDAP 用户条目,则需要。顶层包是
它包含顶层包:
专用领域对象 ACL 实现。用于将安全应用到应用程序中的特定域对象实例。顶层包是
Spring Security 的 CAS 客户端集成。如果你想使用 CAS 单点登录服务器的 Spring Security web 身份验证。顶层包是
OpenID web 身份验证支持。用于对外部 OpenID 服务器进行用户身份验证。 由于Spring Security是一个开源项目,我们强烈鼓励你使用 git 检出源代码。这将使你完全可以访问所有的示例应用程序,并且可以轻松构建项目的最新版本。有一个项目的源代码也是调试的巨大帮助。异常堆栈跟踪不再是晦涩的黑盒子问题,并且你可以直接找到导致问题的线索,并找出发生了什么。源代码是一个项目的最终文档,通常是最简单的地方,以找出如何实际工作。 若要获得项目的源代码,请使用以下 git 命令: git clone https://github.com/spring-projects/spring-security.git 这将使你可以在本地机器上访问整个项目历史(包括所有发行版和分支)。 |