Contents

使用 Maven 设置 Spring Security

1.概述

在本文中,我们将解释如何使用 Maven 设置 Spring Security,并介绍使用 Spring Security 依赖项的特定用例。您可以在 Maven Central 上 找到最新的 Spring Security 版本。

这是上一篇 Spring with Maven 文章 的后续,因此对于非安全 Spring 依赖项,这是开始的地方。

2. 使用 Maven 的 Spring Security

2.1. spring-security-core

核心 Spring Security 支持 - spring-security-core - 包含身份验证和访问控制功能。所有使用 Spring Security 的项目都必须包含此依赖项。

此外,spring-security-core支持独立(非 Web)应用程序、方法级安全性和 JDBC:

<properties>
    <spring-security.version>5.3.4.RELEASE</spring-security.version>
    <spring.version>5.2.8.RELEASE</spring.version>
</properties>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>${spring-security.version}</version>
</dependency>

请注意,Spring 和 Spring Security 的发布计划不同,因此版本号之间并不总是 1:1 匹配。

如果您使用的是旧版本的 Spring – 同样重要的是要了解一个事实,即**Spring Security 4.1.x 不依赖于 Spring 4.1.x 版本!**例如,当Spring Security 4.1.0 发布时,Spring 核心框架已经是 4.2.x,因此包含该版本作为其编译依赖项。计划是在未来的版本中更紧密地调整这些依赖关系——有关更多详细信息,请参阅此JIRA 但就目前而言,这具有实际意义,我们将在接下来研究。

2.2. spring-security-web

要为 Spring Security 添加Web 支持,我们需要spring-security-web依赖项:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${spring-security.version}</version>
</dependency>

这包含过滤器和相关的 Web 安全基础设施,可在 Servlet 环境中启用 URL 访问控制。

2.3. Spring Security 和旧的 Spring Core 依赖问题

这种新的依赖关系也表现出Maven 依赖关系图的问题。如上所述,Spring Security jars 不依赖于最新的 Spring core jars(而是依赖于之前的版本)。这可能会导致这些较旧的依赖项出现在类路径之上,而不是较新的 5.x Spring 工件。

要理解为什么会发生这种情况,我们需要看看Maven 如何解决冲突。在版本冲突的情况下,Maven 将选择最接近的jar。例如,spring-corespring-orm(5.0.0.RELEASE版本)和spring-security-core(5.0.2.RELEASE版本)定义。所以在这两种情况下,spring-jdbc都是在我们项目的根 pom 的深度 1 处定义的。因此,在我们自己的 pom.xml 中定义spring-ormspring-security-core的顺序实际上很重要。第一个将优先,所以我们最终可能会在类路径中使用任一版本

为了解决这个问题,我们必须在我们自己的 pom 中显式定义一些 Spring 依赖,而不是依赖隐式的 Maven 依赖解析机制。这样做会将特定依赖项置于我们的 pom 的深度 0(因为它是在 pom 本身中定义的),因此它将优先。以下所有内容都属于同一类别,并且都需要直接明确定义,或者对于多模块项目,在父项的dependencyManagement元素中进行明确定义:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring-version}</version>
</dependency>

2.4. spring-security-config和其他

要使用丰富的 Spring Security XML 命名空间和注释,我们需要spring-security-config依赖项:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${spring-security.version}</version>
</dependency>

最后,LDAP、ACL、CAS、OAuth 和 OpenID 支持在 Spring Security 中都有自己的依赖项:spring-security-ldapspring-security-aclspring-security-casspring-security-oauthspring-security-openid

3. 使用 Spring Boot

使用 Spring Boot 时,spring-boot-starter-security 启动器将自动包含所有依赖项,例如spring-security-corespring-security-webspring-security-config等:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.3.3.RELEASE</version>
</dependency>

由于 Spring Boot 将自动为我们管理所有依赖项,这也将摆脱前面提到的 Spring 安全性和旧的核心依赖项问题。

4. 使用快照和里程碑

Spring Security里程碑 和快照在 Spring 提供的自定义 Maven 存储库中可用。有关如何配置这些的更多详细信息,请参阅如何使用快照和里程碑