# 获得 Spring 安全性

本节讨论了有关获得 Spring 安全性二进制文件所需了解的所有信息。有关如何获得源代码，请参见[源代码](community.html#community-source)。

## 发行版本编号

Spring 安全版本的格式为 major.minor.patch，例如：

* 主要的版本可能包含断开的更改。通常，这样做是为了提供与现代安全实践相匹配的改进的安全性。

* 小版本包含增强功能，但被视为被动更新。

* 补丁级别应该是完全兼容的，向前和向后，可能的例外情况是修复错误的更改。

## Maven 的用法

与大多数开源项目一样， Spring Security 将其依赖关系部署为 Maven 工件。本节中的主题提供了有关在使用 Maven 时如何使用 Spring 安全性的详细信息。

### Spring 用 Maven 引导

Spring Boot 提供了一个`spring-boot-starter-security`启动器，该启动器将 Spring 与安全相关的依赖关系聚合在一起。使用启动器的最简单和首选的方法是通过使用 IDE 集成（[Eclipse](https://joshlong.com/jl/blogPost/tech_tip_geting_started_with_spring_boot.html)，[IntelliJ](https://www.jetbrains.com/help/idea/spring-boot.html#d1489567e2)，[NetBeans](https://github.com/AlexFalappa/nb-springboot/wiki/Quick-Tour)）或通过[https://start.spring.io](https://start.spring.io)使用[Spring Initializr](https://docs.spring.io/initializr/docs/current/reference/html/)。

或者，你也可以手动添加启动器，如下例所示：

例 1。 POM.xml

```
<dependencies>
	<!-- ... other dependency elements ... -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-security</artifactId>
	</dependency>
</dependencies>
```

由于 Spring 启动提供了一个 Maven BOM 来管理依赖版本，因此你不需要指定版本。如果你希望重写 Spring 安全版本，那么可以通过提供 Maven 属性来实现，如下例所示：

例 2。 POM.xml

```
<properties>
	<!-- ... -->
	<spring-security.version>5.6.2</spring-security.version>
</properties>
```

由于 Spring 安全性仅在主要版本中进行破坏更改，因此使用具有 Spring 启动的 Spring 安全性的较新版本是安全的。然而，有时你可能还需要更新 Spring Framework 的版本。你可以通过添加一个 Maven 属性来做到这一点，如下例所示：

例 3。 POM.xml

```
<properties>
	<!-- ... -->
	<spring.version>5.3.16</spring.version>
</properties>
```

如果使用额外的功能（例如 LDAP、OpenID 和其他功能），还需要包括适当的[项目模块和依赖项](modules.html#modules)。

### Maven 没有靴子

当使用 Spring 安全性而不启动 Spring 时，首选的方法是使用 Spring 安全性的 BOM，以确保在整个项目中使用 Spring 安全性的一致版本。下面的示例展示了如何做到这一点：

例 4。 POM.xml

```
<dependencyManagement>
	<dependencies>
		<!-- ... other dependency elements ... -->
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-bom</artifactId>
			<version>{spring-security-version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
```

一组最小的 Spring 安全性 Maven 依赖关系通常如下所示：

例 5。 POM.xml

```
<dependencies>
	<!-- ... other dependency elements ... -->
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-config</artifactId>
	</dependency>
</dependencies>
```

如果你使用了额外的功能（例如 LDAP、OpenID 和其他功能），则还需要包括适当的[项目模块和依赖项](modules.html#modules)。

Spring 安全性是根据 Spring Framework5.3.16 构建的，但通常应该与 Spring Framework5.x 的任何较新版本一起工作。 Spring 安全性的传递依赖关系解决了 Spring Framework5.3.16，这可能会导致奇怪的 Classpath 问题，许多用户可能会对此感到不满。解决此问题的最简单方法是使用`spring-framework-bom`中`<dependencyManagement>`部分中的`pom.xml`，如下例所示：

例 6。 POM.xml

```
<dependencyManagement>
	<dependencies>
		<!-- ... other dependency elements ... -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-framework-bom</artifactId>
			<version>5.3.16</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
```

前面的示例确保 Spring 安全性的所有传递依赖使用 Spring 5.3.16 模块。

|   |这种方法使用 Maven 的“物料清单”概念，并且仅在 Maven 2.0.9+ 中可用。<br/>有关如何解决依赖关系的更多详细信息，请参见[Maven’s Introduction to the Dependency Mechanism documentation](https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html)。|
|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

### Maven 存储库

所有 GA 版本（即以.release 结尾的版本）都部署到 Maven Central，因此不需要在 POM 中声明额外的 Maven 存储库。

如果使用快照版本，则需要确保定义了 Spring 快照存储库，如下例所示：

例 7。 POM.xml

```
<repositories>
	<!-- ... possibly other repository elements ... -->
	<repository>
		<id>spring-snapshot</id>
		<name>Spring Snapshot Repository</name>
		<url>https://repo.spring.io/snapshot</url>
	</repository>
</repositories>
```

如果使用里程碑或发布候选版本，则需要确保定义了 Spring 里程碑存储库，如下例所示：

例 8。 POM.xml

```
<repositories>
	<!-- ... possibly other repository elements ... -->
	<repository>
		<id>spring-milestone</id>
		<name>Spring Milestone Repository</name>
		<url>https://repo.spring.io/milestone</url>
	</repository>
</repositories>
```

## Gradle

与大多数开源项目一样， Spring Security 将其依赖关系部署为 Maven 工件，这允许一流的 Gradle 支持。以下主题提供了在使用 Gradle 时如何使用 Spring 安全性的详细信息。

### Spring 用 Gradle 引导

Spring 引导提供了一个`spring-boot-starter-security`启动器，该启动器将 Spring 安全相关的依赖关系聚合在一起。使用启动器的最简单和首选方法是通过使用 IDE 集成（[Eclipse](https://joshlong.com/jl/blogPost/tech_tip_geting_started_with_spring_boot.html)，[IntelliJ](https://www.jetbrains.com/help/idea/spring-boot.html#d1489567e2)，[NetBeans](https://github.com/AlexFalappa/nb-springboot/wiki/Quick-Tour)）或通过[https://start.spring.io](https://start.spring.io)使用[Spring Initializr](https://docs.spring.io/initializr/docs/current/reference/html/)。

或者，你也可以手动添加启动器，如下例所示：

示例 9.build. Gradle

```
dependencies {
	compile "org.springframework.boot:spring-boot-starter-security"
}
```

由于 Spring 启动提供了一个 Maven BOM 来管理依赖版本，所以不需要指定版本。如果你希望重写 Spring 安全版本，那么可以通过提供 Gradle 属性来实现，如下例所示：

示例 10.构建。 Gradle

```
ext['spring-security.version']='5.6.2'
```

由于 Spring 安全性仅在主要版本中进行破坏更改，因此使用具有 Spring 启动的 Spring 安全性的较新版本是安全的。然而，有时你可能还需要更新 Spring 框架的版本。你可以通过添加一个 Gradle 属性来做到这一点，如下例所示：

示例 11.build. Gradle

```
ext['spring.version']='5.3.16'
```

如果你使用了额外的功能（例如 LDAP、OpenID 和其他功能），则还需要包括适当的[项目模块和依赖项](modules.html#modules)。

### Gradle 没有靴子

当使用 Spring 安全性而不启动 Spring 时，首选的方法是使用 Spring 安全性的 BOM，以确保在整个项目中使用 Spring 安全性的一致版本。你可以通过使用[依赖管理插件 Name](https://github.com/spring-gradle-plugins/dependency-management-plugin)来实现这一点，如下例所示：

例 12.build. Gradle

```
plugins {
	id "io.spring.dependency-management" version "1.0.6.RELEASE"
}

dependencyManagement {
	imports {
		mavenBom 'org.springframework.security:spring-security-bom:5.6.2'
	}
}
```

Spring 安全性 Maven 依赖性的最小集合通常如下所示：

例 13.build. Gradle

```
dependencies {
	compile "org.springframework.security:spring-security-web"
	compile "org.springframework.security:spring-security-config"
}
```

如果你使用了额外的功能（例如 LDAP、OpenID 和其他功能），则还需要包括适当的[项目模块和依赖项](modules.html#modules)。

Spring 安全性是根据 Spring Framework5.3.16 构建的，但通常应该与 Spring Framework5.x 的任何较新版本一起工作。 Spring 安全性的传递依赖关系解决了 Spring Framework5.3.16，这可能会导致奇怪的 Classpath 问题，许多用户可能会对此感到不满。解决此问题的最简单方法是在`pom.xml`的`<dependencyManagement>`部分中使用`spring-framework-bom`。你可以通过使用[依赖管理插件 Name](https://github.com/spring-gradle-plugins/dependency-management-plugin)来实现这一点，如下例所示：

示例 14.build. Gradle

```
plugins {
	id "io.spring.dependency-management" version "1.0.6.RELEASE"
}

dependencyManagement {
	imports {
		mavenBom 'org.springframework:spring-framework-bom:5.3.16'
	}
}
```

前面的示例确保 Spring 安全性的所有传递依赖使用 Spring 5.3.16 模块。

### Gradle 存储库

所有 GA 版本（即以.release 结尾的版本）都部署到 Maven Central，因此对于 GA 版本，使用 MavenCentral（）存储库就足够了。下面的示例展示了如何做到这一点：

例 15.build. Gradle

```
repositories {
	mavenCentral()
}
```

如果使用快照版本，则需要确保定义了 Spring 快照存储库，如下例所示：

示例 16.build. Gradle

```
repositories {
	maven { url 'https://repo.spring.io/snapshot' }
}
```

如果使用里程碑或发布候选版本，则需要确保定义了 Spring 里程碑存储库，如下例所示：

示例 17.build. Gradle

```
repositories {
	maven { url 'https://repo.spring.io/milestone' }
}
```