K 的博客

记录精彩的程序人生 开始使用

Spring Security

Chapter 1. 介绍

1.1. 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. 历史

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. 发行版本号

了解spring Security发行版本号是非常有用的。它可以帮助你判断升级到新的版本是否需要花费很大的精力。 我们使用apache便携式运行项目版本指南,可以在以下网址查看http://apr.apache.org/versioning.html。 为了方便大家,我们引用页面上的一段介绍:

版本号是一个包含三个整数的组合:主要版本号.次要版本号.补丁。 基本思路是主要版本是不兼容的,大规模升级API。 次要版本号在源代码和二进制要与老版本保持兼容,补丁则意味着向前向后的完全兼容。

1.4. 获得Spring Security

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

1.4.1. 项目模块

在Spring Security 3.0中,项目已经分割成单独的jar,这更清楚的按照功能进行分割模块和第三方依赖。 如果你在使用Maven来构建你的项目,你需要把这些模块添加到你的pom.xml中。 即使你没有使用Maven,我们也推荐你参考这个pom.xml文件, 来了解第三方依赖和对应的版本。可选的,一个好办法是参考实例应用中包含的依赖库。

1.4.1.1. Core - 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. Web - spring-security-web.jar

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

1.4.1.3. Config - spring-security-config.jar

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

1.4.1.4. LDAP - spring-security-ldap.jar

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

1.4.1.5. ACL - spring-security-acl.jar

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

1.4.1.6. CAS - spring-security-cas-client.jar

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

1.4.1.7. OpenID - spring-security-openid.jar

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

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

评论
留下你的脚步