原文链接: 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项目的一个非常好的起点.

Spring Security 3.2.x与Spring 4.0.x的Maven依赖管理的更多相关文章

  1. Spring Security入门(1-13)Spring Security的投票机制和投票器

    1.三种表决方式,默认是 一票制AffirmativeBased public interface AccessDecisionManager { /** * 通过传递的参数来决定用户是否有访问对应受 ...

  2. Spring Security入门(1-12)Spring Security 的过滤器机制

    Servlet过滤器被用来拦截用户请求来进行请求之前或之后的处理,或者干脆重定向这个请求,这取决于servlet过滤器的功能. Servlet过滤器处理之后的目标servlet是 MVC 分发web ...

  3. Spring Security 入门(1-6-1)Spring Security - 配置文件解析和访问请求处理

    1.在pom.xml中添加maven坐标 <dependency> <groupId>org.springframework.security</groupId> ...

  4. Spring Security 入门(1-7)Spring Security - Session管理

    参考链接:https://xueliang.org/article/detail/20170302232815082 session 管理 Spring Security 通过 http 元素下的子元 ...

  5. Spring Security 入门(1-3-5)Spring Security - remember me!

    Remember-Me 功能 概述 Remember-Me 是指网站能够在 Session 之间记住登录用户的身份,具体来说就是我成功认证一次之后在一定的时间内我可以不用再输入用户名和密码进行登录了, ...

  6. Spring Security 入门(1-5)Spring Security - 匿名认证

    匿名认证 对于匿名访问的用户,Spring Security 支持为其建立一个匿名的 AnonymousAuthenticationToken 存放在 SecurityContextHolder 中, ...

  7. Spring Security 入门(1-3-3)Spring Security - logout 退出登录

    要实现退出登录的功能我们需要在 http 元素下定义 logout 元素,这样 Spring Security 将自动为我们添加用于处理退出登录的过滤器 LogoutFilter 到 FilterCh ...

  8. Spring Security 入门(1-6-2)Spring Security - 内置的filter顺序、自定义filter、http元素和对应的filterChain

    Spring Security 的底层是通过一系列的 Filter 来管理的,每个 Filter 都有其自身的功能,而且各个 Filter 在功能上还有关联关系,所以它们的顺序也是非常重要的. 1.S ...

  9. Spring Security 入门(1-3-2)Spring Security - http元素 - intercept-url配置

    http元素下可以配置登录页面,也可以配置 url 拦截. 1.直接配置拦截url和对应的访问权限 <security:http use-expressions="false" ...

随机推荐

  1. Mfc资源消息的响应机制

    Mfc消息的响应机制 Mfc中有很多资源,如图标资源,菜单资源,工具栏资源等等:那么,资源是如何进行消息响应和消息映射的呢? 它们的流程是: 某种资源——对应的ID号——消息映射——响应函数的声明与实 ...

  2. [IOS]Setting Bundle + StoryBoard

    用storyboard添加一个导航栏,其中首页有一个switch,与setting联动,还有一个button,使用modal连接另一个viewControl,其上也有一个按钮,按下销毁本viewCon ...

  3. Linux下同时运行不同版本的qt程序

    因项目需要,可能有不同版本的qt程序要运行到同一台机器上,本次实验是qt4.8.5和qt5.3.1开发的程序同时运行在同一台机器上,此机器可以不按照qt的任何版本,当然,两个版本开发的qt与机器的位数 ...

  4. CImage类

    CImage封装了DIB(设备无关位图)的功能,因而可以让我们能够处理每个位图像素.这里介绍GDI+和CImage的一般使用方法和技巧. TAG: GDI  CImage  后处理   我们知道,Vi ...

  5. HTML 页面载入 Flash 插件的几种方法

    前言 之所以写这篇文章,主要是由于组长给提的一个新的需求--使用浏览器调用电脑的摄像头,来实现即时拍照的功能.在网上查了非常多资料,由于这样那样的原因,终于选择了使用flash插件来调用pc的摄像头. ...

  6. 在Ubuntu Desktop打开终端的2种方式

    共有3中方法: 1.在Ubuntu左上角选择File/Open in Terminal 2.快捷键alt+F2调出Run a Command,输入gnome-terminal 添加右键支持 在终端,输 ...

  7. NET单元测试的艺术

    NET单元测试的艺术 开篇:上一篇我们学习基本的单元测试基础知识和入门实例.但是,如果我们要测试的方法依赖于一个外部资源,如文件系统.数据库.Web服务或者其他难以控制的东西,那又该如何编写测试呢?为 ...

  8. PCI 总线学习笔记

    转载请注明出处:http://blog.csdn.net/lg2lh/article/details/8042008 PCI的基本协议这里就不介绍了,由于一般的芯片协议都是集成好的,我仅仅须要大体了解 ...

  9. Android仿iOS7的UISegmentedControl 分段

    效果图: 这里仅仅简单做了两个button的. 首先是两个button的背景: res/drawable/seg_left.xml <?xml version="1.0" e ...

  10. MySQL多表查询之外键、表连接、子查询、索引

    MySQL多表查询之外键.表连接.子查询.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为 ...