天天看点

Spring Security 详细介绍学习一

Spring Security 是什么?

        Spring Security 为基于 J2EE 企业应用软件提供了全面安全服务。 特别是使用领先的 J2EE 解决方案-spring 框架开发的企业软件项目。如果你没有使用 Spring 开发企业软件, 我们热情的推荐你仔细研究一下。熟悉 Spring-尤其是依赖注入原理-将帮助你更快的掌握 Spring Security。 人们使用 Spring Security 有很多种原因, 不过通常吸引他们的是在 J2EE Servlet 规范 或 EJB 规范中找不到典型企业应用场景的解决方案。 提到这些规范,特别要指出的是它们 不能在 WAR 或 EAR 级别进行移植。这样,如果你更换服务器环境, 就要,在新的目标环 境进行大量的工作,对你的应用系统进行重新配置安全。 使用 Spring Security 解决了这 些问题,也为你提供了很多有用的,可定制的其他安全特性。 你可能知道,安全包括两个主要操作, “认证”和“验证”(或权限控制)。 这就是 Spring Security 面向的两个主要方向。“认证” 是为用户建立一个他所声明的主体的过程, (“主 体”一般是指用户,设备或可以在你系统中执行行动的其他系统)。 “验证”指的一个用户能 否在你的应用中执行某个操作。 在到达授权判断之前,身份的主体已经由身份验证过程建 立了。 这些概念是通用的,不是 Spring Security 特有的。 在身份验证层面,Spring Security 广泛支持各种身份验证模式。 这些验证模型绝大多数 都由第三方提供,或正在开发的有关标准机构提供的,例如Internet Engineering Task Force。 作为补充,Spring Security 也提供了自己的一套验证功能。 Spring Security 目前支持认证一体化和如下认证技术: HTTP BASIC authentication headers (一个基于 IEFT RFC 的标准) HTTP Digest authentication headers (一个基于 IEFT RFC 的标准) HTTP X.509 client certificate exchange (一个基于 IEFT RFC 的标准) LDAP (一个非常常见的跨平台认证需要做法,特别是在大环境) Form-based authentication (提供简单用户接口的需求) OpenID authentication 基于预先建立的请求头进行认证 (比如 Computer Associates Siteminder) JA-SIG Central Authentication Service (也被称为 CAS,这是一个流行的开源单点登录系统) Transparent authentication context propagation for Remote Method Invocation (RMI) and HttpInvoker (一个 Spring 远程调用协议) Automatic "remember-me" authentication (这样你可以设置一段时间,避免在一段时 间内还需要重新验证) Anonymous authentication (允许任何调用,自动假设一个特定的安全主体) Run-as authentication (这在一个会话内使用不同安全身份的时候是非常有用的) Java Authentication and Authorization Service (JAAS) JEE Container autentication (这样,你可以继续使用容器管理认证,如果想的话) Kerberos Java Open Source Single Sign On (JOSSO) * OpenNMS Network Management Platform * AppFuse * AndroMDA * Mule ESB * Direct Web Request (DWR) * Grails * Tapestry * JTrac * Jasypt * Roller * Elastic Plath * Atlassian Crowd * 你自己的认证系统(向下看) (* 是指由第三方提供,查看我们的整合网页,获得最新详情的链接。) 许多独立软件供应商(ISVs, independent software vendors)采用 Spring Security, 是因为它拥有丰富灵活的验证模型。 这样,无论终端用户需要什么,他们都可以快速集成 到系统中,不用花很多功夫,也不用让用户改变运行环境。 如果上述的验证机制都没有满 足你的需要,Spring Security 是一个开放的平台,编写自己的验证机制是十分简单的。 Spring Security 的许多企业用户需要整合不遵循任何特定安全标准的“遗留”系统,Spring Security 在这类系统上也表现的很好。

有时基本的认证是不够的。 有时你需要根据在主体和应用交互的方式来应用不同的安全措 施。比如,你可能,为了保护密码,不被窃听或受到中间人攻击,希望确保请求只通过 HTTPS 到达。 这在防止暴力攻击保护密码恢复过程特别有帮助, 或者简单的,让人难以复制你的 系统的关键字内容。 为了帮助你实现这些目标,Spring Security 完全支持自动“信道安 全”, 整合 jcaptcha 一体化进行人类用户检测。 Spring Security 不仅提供认证功能,也提供了完备的授权功能。 在授权方面主要有三个

领域,授权 web 请求,授权被调用方法,授权访问单个对象的实例。 为了帮你了解它们之 间的区别,对照考虑授在 Servlet 规范 web 模式安全,EJB 容器管理安全,和文件系统安 全方面的授权方式。 Spring Security 在所有这些重要领域都提供了完备的能力,我们将 在这份参考指南的后面进行探讨。 

            1.2. 1.2. 1.2. 1.2. 历史 Spring Security 开始于2003年年底,““spring 的 acegi 安全系统”。 起因是 Spring 开 发者邮件列表中的一个问题,有人提问是否考虑提供一个基于 spring 的安全实现。 在当 时 Spring 的社区相对较小(尤其是和今天的规模比!),其实 Spring 本身是从2003年初 才作为一个 sourceforge 的项目出现的。 对这个问题的回应是,这的确是一个值得研究的 领域,虽然限于时间问题阻碍了对它的继续研究。 有鉴于此,一个简单的安全实现建立起来了,但没有发布。 几周之后,spring 社区的其他 成员询问安全问题,代码就被提供给了他们。 随后又有人请求,在2004年一月左右,有 20人在使用这些代码。 另外一些人加入到这些先行者中来,并建议在 sourceforge 上建 立一个项目,项目在2004年3月正式建立起来。 在早期,项目本身没有自己的认证模块。 认证过程都是依赖容器管理安全的,而 acegi 则 注重授权。 这在一开始是合适的,但随着越来越多用户要求提供额外的容器支持,基于容 器认证的限制就显现出来了。 还有一个有关的问题,向容器的 classpath 中添加新 jar, 常常让最终用户感到困惑,又容易出现配置错误。 随后 acegi 加入了认证服务。大约一年后,acegi 成为 spring 的官方子项目。 经过了两 年半在许多生产软件项目中的活跃使用和数以万计的改善和社区的贡献,1.0.0最终版本发 布于2006年5月。 acegi 在2007年年底,正式成为 spring 组合项目,被更名为“Spring Security”。 现在,Spring Security 成为了一个强大而又活跃的开源社区。 在 Spring Security 支持 论坛上有成千上万的信息。 有一个积极的核心开发团队专职开发,一个积极的社区定期共 享补丁并支持他们的同伴。 

1.3. 1.3. 1.3. 1.3. 发行版本号

了解 spring Security 发行版本号是非常有用的。它可以帮助你判断升级到新的版本是否 需要花费很大的精力。 我们使用 apache 便携式运行项目版本指南,可以在以下网址查看 http://apr.apache.org/versioning.html。 为了方便大家,我们引用页面上的一段介绍: “版本号是一个包含三个整数的组合:主要版本号.次要版本号.补丁。 基本思路是主要版本 是不兼容的,大规模升级 API。 次要版本号在源代码和二进制要与老版本保持兼容,补丁 则意味着向前向后的完全兼容。”

 1.4. 1.4. 1.4. 1.4. 获得 Spring Spring Spring Spring Security Security Security Security

你可以通过多种方式获得 Spring Security。你可以下载打包好的发行包,从 Spring 的网 站 下载页,下载单独的 jar(和实例 WAR 文件)从 Maven 中央资源库(或者SpringSource Maven 资源库,获得快照和里程碑发布)。 可选的,你可以通过源代码创建项目。参考项 目网站获得更多细节。 

1.4.1. 1.4.1. 1.4.1. 1.4.1. 项目模块 在 Spring Security 3.0中,项目已经分割成单独的 jar,这更清楚的按照功能进行分割模 块和第三方依赖。 如果你在使用 Maven 来构建你的项目,你需要把这些模块添加到你的

pom.xml 中。 即使你没有使用 Maven,我们也推荐你参考这个 pom.xml 文件, 来了 解第三方依赖和对应的版本。可选的,一个好办法是参考实例应用中包含的依赖库。

 1.4.1.1. 1.4.1.1. 1.4.1.1. 1.4.1.1. Core Core Core Core - spring-security-core.jar spring-security-core.jar spring-security-core.jar spring-security-core.jar 包含了核心认证和权限控制类和接口, 运程支持和基本供应 API。使用 Spring Security 所必须的。支持单独运行的应用, 远程客户端,方法(服务层)安全和 JDBC 用户供应。 包含顶级包: org.springframework.security.core org.springframework.security.access org.springframework.security.authentication org.springframework.security.provisioning org.springframework.security.remoting 

1.4.1.2. 1.4.1.2. 1.4.1.2. 1.4.1.2. Web Web Web Web - spring-security-web.jar spring-security-web.jar spring-security-web.jar spring-security-web.jar 包含过滤器和对应的 web 安全架构代码。任何需要依赖 servlet API 的。 你将需要它,如 果 你 需 要 Spring Security Web 认 证 服 务 和 基 于 URL 的 权 限 控 制 。 主 包 是 org.springframework.security.web。 

1.4.1.3. 1.4.1.3. 1.4.1.3. 1.4.1.3. Config Config Config Config - spring-security-config.jar spring-security-config.jar spring-security-config.jar spring-security-config.jar

包含安全命名控制解析代码(因此我们不能直接把它用在你的应用中)。你需要它, 如果使 用 了 Spring Security XML 命 名 控 制 来 进 行 配 置 。 主 包 是 org.springframework.security.config。 

1.4.1.4. 1.4.1.4. 1.4.1.4. 1.4.1.4. LDAP LDAP LDAP LDAP - spring-security-ldap.jar spring-security-ldap.jar spring-security-ldap.jar spring-security-ldap.jar LDAP 认证和实现代码,如果你需要使用 LDAP 认证或管理 LDAP 用户实体就是必须的。顶 级包是 org.springframework.security.ldap。 

1.4.1.5. 1.4.1.5. 1.4.1.5. 1.4.1.5. ACL ACL ACL ACL - spring-security-acl.jar spring-security-acl.jar spring-security-acl.jar spring-security-acl.jar 处理领域对象 ACL 实现。用来提供安全给特定的领域对象实例,在你的应用中。 顶级包是 org.springframework.security.acls。

 1.4.1.6. 1.4.1.6. 1.4.1.6. 1.4.1.6. CAS CAS CAS CAS - spring-security-cas-client.jar spring-security-cas-client.jar spring-security-cas-client.jar spring-security-cas-client.jar Spring Security 的 CAs 客户端集成。如果你希望使用 Spring Security web 认证 整合 一个 CAS 单点登录服务器。顶级包是 org.springframework.security.cas。 

1.4.1.7. 1.4.1.7. 1.4.1.7. 1.4.1.7. OpenID OpenID OpenID OpenID - spring-security-openid.jar spring-security-openid.jar spring-security-openid.jar spring-security-openid.jar OpenID web 认 证 支 持 。 用 来 认 证 用 户 , 通 过 一 个 外 部 的 OpenID 服 务 。 org.springframework.security.openid。需要 OpenID4Java。

 1.4.2. 1.4.2. 1.4.2. 1.4.2. 获得源代码 Spring Security 是一个开源项目,我们大力推荐你从 subversion 获得源代码。 这样你 可以获得所有的示例,你可以很容易的建立目前最新的项目。 获得项目的源代码对调试也 有很大的帮助。 异常堆栈不再是模糊的黑盒问题,你可以直接找到发生问题的那一行,查 找发生了什么额外难题。 源代码也是项目的最终文档,常常是最简单的方法,找出这些事 情是如何工作的。 要像获得项目最新的源代码,使用如下 subversion 命令:

svn checkout http://acegisecurity.svn.sourceforge.net/svnroot/acegisecurity/spring-security/trunk/

你 可 以 获 得 特 定 版 本 的 源 代 码 http://acegisecurity.svn.sourceforge.net/svnroot/acegisecurity/spring-security /tags/.

继续阅读