学习 Spring Security(一)Maven

http://www.baeldung.com/spring-security-with-maven
作者:Eugen Paraschiv
译者:oopsguy.com

1、概述

本文将介绍如何使用 Maven 配置 Spring Security 和介绍使用 Spring Security 依赖的具体用例。最新的 Spring Security 版本可以在 Maven Central 上获取。

2、Spring Security 与 Maven

2.1、spring-security-core

Spring Security 核心支持(spring-security-core)包含身份验证和访问控制功能,并支持独立(非 Web)应用、方法级安全策略和 JDBC 整合:

1
2
3
4
5
6
7
8
9
<properties>
<org.springframework.security.version>3.2.3.RELEASE</org.springframework.security.version>
<org.springframework.version>4.0.4.RELEASE</org.springframework.version>
</properties>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${org.springframework.security.version}</version>
</dependency>

请注意,我们使用了 Spring Security 的 3.2.x.RELEASE 版本 —— Spring 和 Spring Security 的发行时间不同,因此他们的版本号不存在对应关系。

如果你使用的是旧版本的 Spring,那么非常重要的一点就是:Spring Security 3.1.x 不依赖于 Spring 3.1.x 发行版!这是因为 Spring Security 3.1.x 早于 Spring 3.1 发布。未来这些依赖的版本号将逐渐靠拢 —— 有关更多详细信息,请参阅此 JIRA — 但在目前看来,这还是有实际意义的,我们将在下面讨论。

2.2、spring-security-web

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

1
2
3
4
5
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${org.springframework.security.version}</version>
</dependency>

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

2.3、Spring Security 与较早的 Spring Core 依赖问题

这个新依赖跟 Maven 依赖图存在一个问题 —— 如上所述,Spring Security jar 不依赖于最新的 Spring core jar(但之前的版本不是这样)。这可能会导致较旧的依赖被使用,而不是较新的 4.x Spring 工件(artifact)。

为了了解为什么会发生这种情况,我们需要看看 Maven 是如何解决冲突的 —— 在版本冲突情况下,Maven 会选择最靠近树根节点的 jar。在我们的例子中,spring-core 由 spring-orm(4.x.RELEASE 版本)定义,也由 spring-security-core(旧的 3.2.8.RELEASE 版本)定义 —— 所以在这两种情况下,spring-jdbc 在我们项目的根 pom 定义的深度为 1 。因此,在我们自己的 pom 中定义的 spring-orm 和 spring-security-core 是怎样使用顺序呢 —— 优先考虑第一个,因此我们可能会在 classpath 中使用任一版本。

为了解决这个问题,我们在 pom 中必须明确定义一些 Spring 依赖,而不是依赖于隐式的 Maven 依赖解析机制 —— 这样做会使我们 pom 中的特定依赖深度为 0 (因为它本身定义在 pom 中),因此它会优先被考虑。以下所有都属于同一类别,都需要明确定义,对于多模块项目,需要在父级的 dependencyManagement 元素中定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework.version}</version>
</dependency>

2.4、spring-security-config 等

要想使用 Spring Security XML 命名空间,需要添加 spring-security-config 依赖:

1
2
3
4
5
6
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${org.springframework.security.version}</version>
<scope>runtime</scope>
</dependency>

没有应用代码需要用到该依赖进行编译,因此它应该设置为 runtime 作用域。

LDAP、ACL、CAS 和 OpenID 也有 Spring Security 的相关依赖:spring-security-ldap、spring-security-acl、spring-security-cas 和 spring-security-openid。

3、使用 Snapshots 和 Milestones

Spring 在自定义 Maven 仓库中提供了 Spring Security milestones(里程碑版本) 和 snapshots(快照版本),有关配置的更多详细信息,请参阅如何使用 milestones 和 snapshots

4、结论

本文讨论了使用 Spring Security 与 Maven 的相关细节。这里提到的 Maven 依赖只是一些重要的常用依赖。但这也为你在 Maven 项目中使用 Spring 提供了很好的参考点。

文中相关链接