前言
Spring Security为基于J2EE企业应用软件提供了全面的安全解决方案。正如你会发现通过本参考手册的尝试,我们试着向你提供一个有用的和高度的可配置的安全系统。 安全是一个永恒的目标,它重要追求的是综合的、系统级的实现方式。在安全领域我们鼓励您采用“分层安全”,这样每一层在自己的范围内都能尽可能得做到安全,并为连续的层之间提供额外的安全。每一层越“坚固”,您的系统将越强壮和安全。为了减轻“中间人”(man-in-the-middle)的攻击,在底层您将会处理诸如传输安全和系统认证。接下来您将可能用到防火墙,也许还会用到VPN或者IP策略来确保只有授权的系统可以尝试连接。在企业环境中您可能部署一个DMZ(demilitarized zone,隔离区)来把面向公众的服务器和后端的数据和应用服务器分隔开。您的操作系统也将发挥重要的作用,在解决诸如为非授权用户运行进程和文件系统安全最大化上。一个操作系统通常也会配置自己的防火墙。希望在前进的道路上,你能有效地防止拒绝服务攻击和暴力攻击系统。入侵检测系统在检测和应对攻击方面尤其有用,这种系统能够采取诸如实时地阻止非法TCP/IP地址的保护措施。在更高的层上,你的Java虚拟机需要进行配置,将授予不同Java类型的权限最小化,然后,您的应用程序将添加针对自己特定问题域的安全配置。Spring Security使后者应用程序安全更容易。
当然,您将需要妥善处理如上所述的所有安全层,再加上管理因素,它涵盖了各个层面。一份非详细的包含管理因素的清单可能包括安全公告监测,补丁,人工诊断,审计,变更管理,工程管理系统,数据备份,灾难恢复,性能基准,负载监测,集中日志记录,应急反应程序等。
Spring Security着重帮助您处理企业应用安全层,你会发现各式各样的需求和商业问题领域一样多。银行的应用和电子商务应用有不同的需求。电子商务应用和公司销售人员的自动化工具又有不同的需求。这些客户化的需求使得应用安全显得有趣,富有挑战性和满足感。
本参考手册已大量修改已经发行的Spring Security 1.0.0(当时名为Acegi Security)。请阅读第一部分总体结构的所有内容。其余部分的参考指南,在结构上更多参考传统的文档作风,旨在有利于在原有的基础上阅读。
我们希望您觉得这是有用的参考指南,我们对此欢迎您提供意见和建议。
最后,欢迎访问Spring Security社区。
第一部分. 入门 本指南的后面部分提供了一个深入讨论的框架结构和各个实现类,如果您需要做任何安全的定制,理解这些是非常重要的。在这部分中,我们将介绍Spring Security 2.0,给予简要概述该项目的历史,并采取稍微温和地方式看看如何开始使用该框架。事实上,我们将会看到命名空间的配置,它提供了更简单的方式来保护你的系统,而区别于传统的使用Spring bean的方式,不得不为各个实现类配置成bean。
我们也将看看可用的例子应用程序。这是值得尝试去运行这些例子的,值得在阅读后面的部分之前对例子进行实验---随着你增加对框架的理解,你可以先浏览后面的部分。
第一章简介
1.1.什么是Spring Security?
Spring Security为基于J2EE的企业应用软件提供全面的安全服务。它特别强调和支持在项目中使用Spring框架,Spring框架为企业软件开发提供领先的J2EE解决方案。如果您没有使用Spring来开发企业应用,我们强烈鼓励您仔细看看它。熟悉Spring框架,特别是依赖注入原则将有利于帮助您更方便地掌握Spring Security。 人们使用Spring Security有很多原因,不过通常吸引他们到这个项目的原因是他们在J2EE的Servlet规范或者EJB规范中找不到迫切需要的典型企业应用场景。提到这些规范,特别值得一提的是他们在WAR或者EAR级别是不可移植的。因此,如果您切换服务器,一般来说您要在目标环境中花费很多工夫来重新配置您的应用安全。使用Spring Security可以解决了这些问题,并且为您提供了很多其他有用的,完全可定制的安全特性。 正如你所知,安全包含2个主要的操作。第一个被称为“认证”,是为用户建立一个它所声明的principal。Principal通常代表用户,设备,或者能在你的应用中执行操作的其他系统。“授权”指判定一个principal能否在你的系统中执行某个操作。在到达授权判断之前,principal的身份认证已经由认证过程执行过了。这些概念是通用的,而不是Spring Security特有的。 在认证层面上,Spring Security广泛支持各种认证模式。这些认证模式绝大多数是第三方提供,或者是由相关的标准组织开发的,例如Internet Engineering Task Force。作为补充,Spring Security提供了一些自己认证功能。具体来说,Spring Security当前支持如下的认证技术: • HTTP BASIC authentication headers (an IEFT RFC-based standard) • HTTP Digest authentication headers (an IEFT RFC-based standard) • HTTP X.509 client certificate exchange (an IEFT RFC-based standard) • LDAP (a very common approach to cross-platform authentication needs, especially in large environments) • Form-based authentication (for simple user interface needs) • OpenID authentication • Computer Associates Siteminder • JA-SIG Central Authentication Service (otherwise known as CAS, which is a popular open source single sign on system) • Transparent authentication context propagation for Remote Method Invocation (RMI) and HttpInvoker (a Spring remoting protocol) • Automatic "remember-me" authentication (so you can tick a box to avoid re-authentication for a predetermined period of time) • Anonymous authentication (allowing every call to automatically assume a particular security identity) • Run-as authentication (which is useful if one call should proceed with a different security identity) • Java Authentication and Authorization Service (JAAS) • Container integration with JBoss, Jetty, Resin and Tomcat (so you can still use Container Manager Authentication if desired) • 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)选择Spring Security是因为它具有丰富的认证模块。这样无论他们的最终客户需要什么,他们都可以快速集成到他们的系统中,不用花很多工夫或者让客户改变环境。如果上述所有认证模块还没有满足您的需求的话,Spring Security是一个开放的系统,您很容易写自己的认证机制。许多Spring Security的企业用户需要整合 “遗留”系统,这些遗留系统不遵循任何安全标准,Spring Security能够和这样的系统“合作愉快”。 有时候仅仅只有认证的过程是不够。有时候你需要根据principal和应用交互的方式来采用不同的安全措施。例如,你可能为了防止密码被窃取,或者防止终端用户受到“中间人”的攻击,需要确保到达的是请求是通过HTTPS的。或者,你要确保发送请求的是一个真正的人而不是某种机器人或者自动进程。这对于保护密码恢复过程不受到暴力破解的攻击,或者防止他人很容易的复制你应用的关键内容是极其有帮助的。为了帮助你实现这些目标,Spring Security完全支持自动“通道安全”,以及集成Jcaptcha来检测是否是真正的人类用户在使用。 不管认证是如何执行的,Spring Security还提供了一套完备的授权功能。在授权方面主要有三个领域,授权web请求、授权方法调用和授权存取单个领域对象实例。为了帮助你理解这些区别,对照考虑一下Servlet规范中的web模式安全的授权功能、EJB容器管理安全以及文件系统安全。Spring Security提供了所有这些重要领域的完备功能,我们将在本手册的后面介绍这些功能。 1.2. 历史
Spring Security始于2003年晚期作为"The Acegi Security System for Spring"。在Spring Developers邮件列表中有人提问是否有人考虑提供一个基于Spring的安全实现。当时,Spring的社区是相对较小的(尤其是和今天相比!),实际上Spring本身也是在2003年早期才作为一个SourceForge项目出现的。虽然限于当时的时间无法进行深入,但对此问题的回应是它确实是一个值得研究的领域。 在这种情况下,一个简单的安全实现被构建出来,但是没有发布。几周后,Spring社区的其他成员又询问了关于安全的实现,同时代码就提供给了他们。随后又有人提出了询问,到了2004年一月,大约有20人左右在使用这些代码。另外一些人加入到这些先驱用户中来,他们建议建立一个SourceForge项目,这个项目在2004年3月建立起来。 在早期,这个项目还没有它自己的认证模块。认证过程依赖容器管理安全,而Acegi Security注重授权。在一开始这样是合适的,但是随着越来越多的用户要求提供额外的容器支持,这种基于容器的认证的限制就显现出来了。另外一个相关的问题是添加新的JAR文件到容器的classpath中,这个公共的源代码通常会让最终用户感到困惑并且配置错误。 Acegi Security随后加入了认证服务。大约一年以后,Acegi Security成为了一个Spring框架的官方子项目。在多达2年半的时间里,多个软件项目中积极地使用它,并且经过数以百计的改进和社区贡献,1.0.0最终版在2006年5月发布。 在2007年底,Acegi Security正式成为Spring Portfolio项目,并更名为“Spring Security”。 今天,Spring Security拥有一个强大而活跃的开源社区。在社区支持的论坛上拥有数以千计的帖子。有活跃的核心开发人员进行编码工作,还有一个活跃的社区也定期共享补丁并相互间进行帮助支持。 1.3. 发行版本号
理解Spring Security的版本号是非常有好处的,它可以帮助你判定升级到新版本是否需要花费很大的精力。我们的正式发行版本使用Apache Portable Runtime Project版本指引,可以通过访问网站进行查看http://apr.apache.org/versioning.html。为了方便您查看,我们引用该网页的说明部分如下: “版本号由三个部分的整数组成:主版本号(MAJOR)、副版本号(MINOR)、补丁版本号(PATCH)。主要的含义是主版本号(MAJOR)是不兼容的,大规模升级API。副版本号(MINOR)保持源文件、可执行二进制文件与老版本的兼容,补丁版本号(PATCH)则意味着向前和向后的完全兼容”。 |