1.简介
在这篇文章中,我们将演示如何针对非常特定的用例将Maven依赖项用于Spring Security。 我们使用的所有库的最新版本都可以在Maven Central上找到。
在项目中,了解Maven依赖项的工作方式和管理方式对于有效的构建周期非常重要,并且对于我们在项目中使用的各种库之间的版本之间应有清晰的定义,这很重要。 这是由于我们经常在多个项目中重复一组依赖项的原因,并且当我们不了解为什么要使用特定的库版本时,我们应该犯错。 让我们了解一下Spring Security和Spring Framework依赖关系之间的关系。
2.使用Maven的Spring Security
在本节中,我们将介绍管理Maven依赖关系的特定用例。 这是由于Spring Security涉及许多功能,而不是您可能想要集成到应用程序中的每个功能都不需要所有依赖项的原因。 这些功能包括(但不限于):
- 通过Spring Security保护注册过程
- 密码加密,以便即使有人可以访问数据库也可以保护密码
- 管理用户角色和权限,以便每个用户都有可以在应用程序中执行的特定操作
- 从应用程序中的Spring Security检索用户信息以及分配给用户的角色和特权
- 受保护的RESTful API,因此访问受到限制
2.1 spring-security-web
Spring Security Web依赖项用于提供与应用程序的Web安全相关的功能,例如:
- 在Servlet容器环境中对URL的访问受到限制
- 管理与Web相关的Spring Secuirty过滤器
要在Spring Security中添加Web支持,以下是所需的依赖项:
Spring安全网
<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-web</artifactId><version>${org.springframework.security.version}</version>
</dependency>
请注意,我们还定义了用作Maven属性的Spring框架和Spring Security的版本,并在我们针对这些模块提到的所有依赖关系中重复使用了该版本。
需要注意的要点是,Spring Framework和Spring Security遵循的时间表不同,因此版本号并不完全匹配 。 注意这一点很重要,因为例如,由于Spring Security 3.1.x是在Spring 3.1之前发行的,因此Spring Security 3.1.x不依赖于Spring 3.1.x发行版。
最后,要了解添加此依赖项时添加到项目中的所有JAR,我们可以运行一个简单的Maven命令,当我们向其添加一些依赖项时,该命令使我们能够查看项目的完整依赖关系树。 这是我们可以使用的命令:
检查依赖树
mvn dependency:tree
当我们运行此命令时,它将向我们显示以下依赖关系树:
如上图所示, spring-security-web
JAR还带来了其他一些依赖性,例如spring-aop
, spring-beans
, spring-context
, spring-core
, spring-expression
和spring-web
。 当我们运行上面的命令时,在向我们展示依赖树之前,maven首先再次下载了JAR,以确认是否已更改。
最后,请注意,如果其中一个依赖项需要另一个依赖项才能运行,则该依赖项也已下载并在上面的依赖关系树中显示为该树的子分支。 当某种依赖关系将另一个依赖项带入构建系统的依赖项池时,间接依赖项的子分支表示方法将被清除。
2.2 spring-security-core
现在,让我们看一下Spring Security实现所需的核心依赖项:
Spring安全核心
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-core</artifactId><version>${org.springframework.security.version}</version>
</dependency>
有了Spring Security Core依赖关系,我们就可以使用以下功能:
- 访问控制
- 方法级安全
- 也支持非Web应用程序
这是Spring Security Maven依赖项家族中最常用的依赖项之一。 现在让我们看一下spring-security-core
JAR的依赖关系树:
2.3 spring-security-config
如果您对与Spring Security相关的benas使用XML名称空间定义,则在应用程序中需要spring-security-config Maven依赖项。
弹簧安全配置
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>${org.springframework.security.version}</version><scope>runtime</scope>
</dependency>
由于此依赖项仅在XML名称空间定义中使用,因此使用运行时范围来定义它。 请注意,其他配置功能(例如ACL,CAS,OpenID和LDAP)具有其自己的依赖性,例如: spring-security-acl , spring-security-cas , spring-security-openid和spring-security-ldap 。 即使依赖项具有运行时范围,但是仍然会下载其依赖项,让我们在这里查看其依赖项树:
2.4较旧的Spring Security依赖关系存在的问题
Spring Security JAR引起的一个主要问题是,并不是所有的Spring Security JAR都依赖于最新版本的Spring Framework相关依赖关系,但实际上它们需要较旧版本的依赖关系。 这就是为什么我们需要显式定义这些JAR,以便Maven在开始收集依赖项并针对它们进行编译时不会报告版本冲突。 这是必需的依赖项:
显式依赖
<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>
这样,当我们在自己的pom.xml文件中显式定义一些Spring依赖项时,我们将该依赖项置于0深度,因此,它将优先使用提到的版本,而不是Spring框架依赖项树中的隐式依赖项。 让我们看一下此处的依赖树以清除此问题:
当我们在此处查看依赖关系树时,我们看到由于在pom.xml
文件中明确提及而添加到项目中的JAR的确切版本。
在此处阅读有关解决Maven中的依赖冲突的更多信息。
3. Spring Security中的快照和里程碑
Spring Security提供了Snapshot和Milestone版本,这些版本存在于Spring提供的自定义Maven存储库中。 阅读本课程,以了解如何在您的应用程序中使用这些发行版。
Release构件和Snapshot构件之间的主要区别在于Release构件是特定的和预先计划的发行版,它们是在预定的时间点制作的,被认为是稳定,稳定和永久的,以确保构建依赖于随着时间的推移,它们是可重复的。 Central Maven存储库存储发行工件。
快照可以捕获仍在进行中并在开发过程中使用的项目。 快照构件包含两个部分:版本号(例如“ 1.3.0”或“ 1.3”)和时间戳。 例如,用于spring-framework 1.3.0的快照工件可能具有名称spring-framework-1.3.0-20180323.19283-3.jar。
4。结论
在本课程中,我们讨论了带有Spring Security的各种Maven依赖关系以及初学者在开始使用Spring Security功能时通常会遇到的一些主要问题。 本课是了解所需依赖项的很好的起点。
我们还解释了在将Spring Security与Spring Framework结合使用时,指定某些特定JAR的版本有多么重要,以及我们如何不能依赖Spring Framework为这些JAR选择的依赖版本。 通过指定特定的依赖关系,我们要做的就是确保Maven选择这些显式的版本规范,而不是Spring Framework的依赖版本,以免发生版本冲突。
最后,我们学习了如何使用简单的maven命令显示项目的依赖关系树,并观察项目的哪些依赖关系还取决于其他哪些依赖关系。
在此处阅读有关Spring Framework的更多课程。
5.下载源代码
这是一个示例,显示了如何在项目中使用基于Spring Security的不同依赖关系。
您可以在此处下载此示例的完整源代码: SpringSecurityMaven
翻译自: https://www.javacodegeeks.com/2018/03/spring-security-with-maven-tutorial.html