做者:Eugen Paraschivspring
转载自公众号:stackgcexpress
本文将介绍如何使用 Maven 配置 Spring Security 和介绍使用 Spring Security 依赖的具体用例。最新的 Spring Security 版本能够在 Maven Central 上获取。安全
Spring Security 核心支持(spring-security-core)包含身份验证和访问控制功能,并支持独立(非 Web)应用、方法级安全策略和 JDBC 整合:maven
<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 的发行时间不一样,所以他们的版本号不存在对应关系。spa
若是你使用的是旧版本的 Spring,那么很是重要的一点就是:Spring Security 3.1.x 不依赖于 Spring 3.1.x 发行版!这是由于 Spring Security 3.1.x 早于 Spring 3.1 发布。将来这些依赖的版本号将逐渐靠拢 —— 有关更多详细信息,请参阅此 JIRA — 但在目前看来,这仍是有实际意义的,咱们将在下面讨论。code
要为 Spring Security 添加 Web 支持,须要添加 spring-security-web 依赖:orm
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${org.springframework.security.version}</version>
</dependency>
复制代码
以上包含了过滤器和相关的 Web 安全基础设施,可在 Servlet 环境中启用 URL 访问控制。xml
这个新依赖跟 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 元素中定义:
<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>
复制代码
要想使用 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>
复制代码
没有应用代码须要用到该依赖进行编译,所以它应该设置为 runtime 做用域。
LDAP、ACL、CAS 和 OpenID 也有 Spring Security 的相关依赖:spring-security-ldap、spring-security-acl、spring-security-cas 和 spring-security-openid。
Spring 在自定义 Maven 仓库中提供了 Spring Security milestones(里程碑版本) 和 snapshots(快照版本),有关配置的更多详细信息,请参阅如何使用 milestones 和 snapshots。
本文讨论了使用 Spring Security 与 Maven 的相关细节。这里提到的 Maven 依赖只是一些重要的经常使用依赖。但这也为你在 Maven 项目中使用 Spring 提供了很好的参考点。