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 的可靠起点。