Spring Security 3.2.x与Spring 4.0.x的Maven依赖管理

原文链接: Spring Security with Maven
原文日期: 2013年04月24日
翻译日期: 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项目的一个非常好的起点.

上一篇:16. Spring boot 错误页面


下一篇:【Java】 大话数据结构(15) 排序算法(2) (快速排序及其优化)