翻译日期: 2014年06月29日

翻译人员: ​​铁锚​


1. 概述


本文通过实例为您介绍如何使用 ​Maven 管理 Spring Security 和 Spring 的依赖关系​.最新的Spring Security发布版本可以在 ​​Maven Central仓库​​ 中找到. 译者建议访问​MVNRespotory中org.springframework.security链接​。

本文是 ​​使用Maven管理Spring​​  的续集, 所以对于非 Spring Security 的其他 Spring依赖,请查看 ​​前文​​.


2. Spring Security与Maven

2.1. spring-security-core

Spring Security的核心支持 —— ​spring-security-core​ —— 包含身份认证(authentication)和访问控制(access control)功能,支持独立的(非web)应用程序,方法级的安全性和JDBC:

<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之前发布. Spring计划在以后的版本中将这些依赖关系尽量保持一致,想要了解更多信息可以参考 ​​他们的JIRA计划​​ ,但目前肯定是不一致的,下面我们将看到具体的情况.


2.2. spring-security-web

要为 Spring Security 添加 Web 支持,需要添加

spring-security-web​ 依赖:


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

它包含了在Servlet环境中进行URL访问控制所需的过滤器(filter)及web相关的安全基础类.


2.3. Spring Security 和老版本 Spring Core 的依赖问题 

这个新的依赖也显示了

Maven依赖图的一个问题​ —— 如前所述,Spring Security 的jar包依赖的不是最新的Spring core jar包(而是先前版本的). 这可能会导致出现在 classpath 中的是

旧版本​的依赖,而屏蔽了新版本的 Spring 4.x 项目(artifacts).


要理解为什么会发生这种问题,我们需要看看

Maven是如何解决冲突​的 —— 如果发生版本冲突,Maven将优先选择离依赖树的根(the root of the tree)最近的jar包. 在我们的例子中, spring-core 被两个地方依赖: spring-orm ( 4.x.release 版本)和 spring-security-core (依赖老的 3.2.8.RELEASE 版),所以在这两个地方, 在我们的项目中 spring-jdbc 距离 root pom 的深度为1. 因此,在我们的pom文件中 spring-orm 和 spring-security-core 定义的顺序将起决定作用 - 谁先出现谁就具有优先权, 因此我们最终可能得到的jar包版本并不确定.


要解决这个问题,我们必须明确定义一些Spring的依赖项,而不是使用Maven 的隐式依赖解决机制 —— 我们自己定义以后可以将特定的依赖置于pom中深度为0的层级,保证优先级. 下面的部分需要置于同一个目录下,并且都需要明确定义,如果在多模块项目中,需要置于parent项目的 dependencyManagement 元素下:


<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 和其他jar包

要使用丰富的Spring Security XML名称空间, 需要引入 spring-security-config 依赖:


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

因为没有哪个应用在编译时需要依赖这个jar包,所以它的作用域(

scope​)应该设置为

runtime​ .


最后,LDAP, ACL, CAS 和 OpenID支持对 Spring Security有自己的依赖关系: spring-security-ldap , spring-security-acl , spring-security-cas 和 spring-security-openid .



3. 使用 Snapshots 和 Milestones 版本

Spring Security的

​Milestones(里程碑,M1,M2..)​​ 和

​Snapshots版​​ 在Spring自己的Maven仓库中提供 —— 关于如何配置的细节,请查看

​如何使用Snapshots和Milestones版​​.



4. 总结

本文讨论了使用 ​Maven集成 Spring Security​ 实际的细节 . Maven依赖的介绍当然是最主要的部分,此外还有几个值得一提的技术点和还需要等待的地方. 不过这也算是使用Maven管理Spring项目的一个很好的起点.