1. 概述

本文将详细说明如何通过 Maven 集成 Spring Security,并深入探讨 Spring Security 依赖项的典型应用场景。最新版本的 Spring Security 可在 Maven 中央仓库 获取。

本文是前一篇 Spring 与 Maven 集成 的姊妹篇,非安全相关的 Spring 依赖项配置请参考前文。

2. Spring Security 与 Maven 集成

2.1. spring-security-core 核心依赖

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

此外,该模块还支持:

  • 独立(非 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 采用不同的发布计划,版本号并非严格对应。例如 Spring Security 4.1.x 并不依赖 Spring 4.1.x!当 Spring Security 4.1.0 发布时,Spring 核心框架已升级到 4.2.x,因此其编译依赖实际是 4.2.x 版本。未来版本计划解决此问题(详见 JIRA SEC-2123),但当前仍需特别注意。

2.2. spring-security-web Web 支持

添加 Spring Security Web 支持 需引入 spring-security-web 依赖:

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

此模块包含:

  • Servlet 环境下的安全过滤器
  • Web 安全基础设施
  • URL 访问控制功能

2.3. Spring Security 与旧版 Spring 核心依赖冲突问题

新依赖会引发 Maven 依赖树冲突。如前所述,Spring Security JAR 包依赖的是旧版 Spring 核心包(而非最新版),可能导致旧版本依赖被意外引入类路径。

冲突原理

Maven 解析依赖冲突时,会选择依赖树中最接近根目录的版本。例如:

  • spring-orm 定义了 spring-core(版本 5.0.0.RELEASE)
  • spring-security-core 也定义了 spring-core(版本 5.0.2.RELEASE)

两者在依赖树中深度相同(深度=1),最终生效版本取决于 pom.xml 中的声明顺序——先声明的优先级更高

解决方案

显式声明关键 Spring 依赖,将其置于依赖树深度 0(直接声明),确保优先级:

<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>

💡 多模块项目建议:在父 POM 的 <dependencyManagement> 中统一管理这些依赖。

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 支持:spring-security-ldap
  • ACL 支持:spring-security-acl
  • CAS 集成:spring-security-cas
  • OAuth 支持:spring-security-oauth
  • OpenID 支持:spring-security-openid

3. 使用 Spring Boot

在 Spring Boot 环境中,spring-boot-starter-security 启动器会自动引入所有必要依赖:

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

优势:Spring Boot 自动管理依赖版本,完美解决前文提到的旧版本依赖冲突问题。

4. 使用快照与里程碑版本

Spring Security 的里程碑版本和快照版本托管在 Spring 自定义 Maven 仓库中。配置方法详见 如何使用快照和里程碑版本

5. 总结

本文详细介绍了 Spring Security 与 Maven 集成的核心实践要点。虽然未涵盖所有边缘依赖项,但已覆盖大多数生产场景所需的核心依赖。这些配置可作为在 Maven 项目中集成 Spring Security 的可靠起点。


原始标题:Spring Security with Maven

» 下一篇: Spring MVC教程