SpringSecurity30中文帮助手册.docx
《SpringSecurity30中文帮助手册.docx》由会员分享,可在线阅读,更多相关《SpringSecurity30中文帮助手册.docx(142页珍藏版)》请在冰点文库上搜索。
SpringSecurity30中文帮助手册
序言
SpringSecurity为基于J2EE的企业应用软件提供了一套全面的安全解决方案。
正如你在本手册中看到的那样,我们尝试为您提供一套好用,高可配置的安全系统。
安全问题是一个不断变化的目标,更重要的是寻求一种全面的,系统化的解决方案。
在安全领域我们建议你采取“分层安全”,这样让每一层确保本身尽可能的安全,并为其他层提供额外的安全保障。
每层自身越是“紧密”,你的程序就会越安全。
在底层,你需要处理传输安全和系统认证,减少“中间人攻击”(man-in-the-middleattacks)。
接下来,我们通常会使用防火墙,结合VPN或IP安全来确保只有获得授权的系统才能尝试连接。
在企业环境中,你可能会部署一个DMZ(demilitarizedzone,隔离区),将面向公众的服务器与后端数据库,应用服务器隔离开。
在以非授权用户运行进程和文件系统安全最大化上,你的操作系统也将扮演一个关键的角色。
操作系统通常配置了自己的防火墙。
然后你要防止针对系统的拒绝服务和暴力攻击。
入侵检测系统在检测和应对攻击的时候尤其有用。
这些系统可以实时屏蔽恶意TCP/IP地址。
在更高层上,你需要配置Java虚拟机,将授予不同java类型权限最小化,然后,你的应用程序要添加针对自身特定问题域的安全配置。
SpringSecurity使后者-应用程序安全变得更容易。
当然,你需要妥善处理上面提到的每个安全层,以及包含于每个层的管理因素。
这些管理因素具体包括:
安全公告检测,补丁,人工诊断,审计,变更管理,工程管理系统,数据备份,灾难回复,性能评测,负载检测,集中日志,应急反应程序等等。
SpringSecurity关注的重点是在企业应用安全层为您提供服务,你将发现业务问题领域存在着各式各样的需求。
银行系统跟电子商务应用就有很大的不同。
电子商务系统与企业销售自动化工具又有很大不同。
这些客户化需求让应用安全显得有趣,富有挑战性而且物有所值。
请阅读Part I,“入门”部分,以它作为开始。
它向你介绍了整个框架和以命名空间为基础系统配置方式,让你可以很快启动并运行系统。
要是想更多的了解SpringSecurity是如何工作和一些你可能需要用到的类,你应该阅读Part II,“结构和实现”部分。
本指南的其余部分使用了较传统的参考文档方式,请按照自己的需要选择阅读的部分。
我们也推荐你阅读尽可能多的在应用安全中可能出现的一般问题。
SpringSecurity也不是万能的,它不可能解决所有问题。
重要的一点,应用程序应该从一开始就为安全做好设计。
企图改造它也不是一个好主意。
特别的,如果你在制作一个web应用,你应该知道许多潜在的脆弱性,比如跨域脚本,伪造请求和会话劫持,这些都是你在一开始就应该考虑到的。
OWASP网站(http:
//www.owasp.org/)维护了一个web应用脆弱性前十名的名单,还有很多有用的参考信息。
我们希望你觉得这是一篇很有用的参考指南,并欢迎您提供反馈意见和建议。
最后,欢迎加入SpringSecurity社区。
Part I. 入门
本指南的后面部分提供对框架结构和实现类的深入讨论,了解它们,对你进行复杂的定制是十分重要的。
在这部分,我们将介绍SpringSecurity3.0,简要介绍该项目的历史,然后看看如何开始在程序中使用框架。
特别是,我们将看看命名空间配置提供了一个更加简单的方式,在使用传统的springbean配置时,你不得不实现所有类。
我们也会看看可用的范例程序。
它们值得试着运行,实验,在你阅读后面的章节之前,你可以在对框架有了更多连接之后再回来看这些例子。
也请参考项目网站获得构建项目有用的信息,另外链接到网站,视频和教程。
Chapter 1. 介绍
1.1. SpringSecurity是什么?
SpringSecurity为基于J2EE企业应用软件提供了全面安全服务。
特别是使用领先的J2EE解决方案spring框架开发的企业软件项目。
如果你没有使用Spring开发企业软件,我们热情的推荐你仔细研究一下。
熟悉Spring尤其是依赖注入原理将帮助你更快的掌握SpringSecurity。
人们使用SpringSecurity有很多种原因,不过通常吸引他们的是在J2EEServlet规范或EJB规范中找不到典型企业应用场景的解决方案。
提到这些规范,特别要指出的是它们不能在WAR或EAR级别进行移植。
这样,如果你更换服务器环境,就要在新的目标环境进行大量的工作,对你的应用系统进行重新配置安全。
使用SpringSecurity解决了这些问题,也为你提供了很多有用的,可定制的其他安全特性。
你可能知道,安全包括两个主要操作,“认证”和“验证”(或权限控制)。
这就是SpringSecurity面向的两个主要方向。
“认证”是为用户建立一个他所声明的主体的过程,(“主体”一般是指用户,设备或可以在你系统中执行行动的其他系统)。
“验证”指的一个用户能否在你的应用中执行某个操作。
在到达授权判断之前,身份的主体已经由身份验证过程建立了。
这些概念是通用的,不是SpringSecurity特有的。
在身份验证层面,SpringSecurity广泛支持各种身份验证模式。
这些验证模型绝大多数都由第三方提供,或正在开发的有关标准机构提供的,例如InternetEngineeringTaskForce。
作为补充,SpringSecurity也提供了自己的一套验证功能。
SpringSecurity目前支持认证一体化和如下认证技术:
∙HTTPBASICauthenticationheaders(一个基于IEFTRFC的标准)
∙HTTPDigestauthenticationheaders(一个基于IEFTRFC的标准)
∙HTTPX.509clientcertificateexchange(一个基于IEFTRFC的标准)
∙LDAP(一个非常常见的跨平台认证需要做法,特别是在大环境)
∙Form-basedauthentication(提供简单用户接口的需求)
∙OpenIDauthentication
∙基于预先建立的请求头进行认证(比如ComputerAssociatesSiteminder)
∙JA-SIGCentralAuthenticationService(也被称为CAS,这是一个流行的开源单点登录系统)
∙TransparentauthenticationcontextpropagationforRemoteMethodInvocation(RMI)andHttpInvoker(一个Spring远程调用协议)
∙Automatic"remember-me"authentication(这样你可以设置一段时间,避免在一段时间内还需要重新验证)
∙Anonymousauthentication(允许任何调用,自动假设一个特定的安全主体)
∙Run-asauthentication(这在一个会话内使用不同安全身份的时候是非常有用的)
∙JavaAuthenticationandAuthorizationService(JAAS)
∙JEEContainerautentication(这样,你可以继续使用容器管理认证,如果想的话)
∙Kerberos
∙JavaOpenSourceSingleSignOn(JOSSO)*
∙OpenNMSNetworkManagementPlatform*
∙AppFuse*
∙AndroMDA*
∙MuleESB*
∙DirectWebRequest(DWR)*
∙Grails*
∙Tapestry*
∙JTrac*
∙Jasypt*
∙Roller*
∙ElasticPlath*
∙AtlassianCrowd*
∙你自己的认证系统(向下看)
(*是指由第三方提供,查看我们的整合网页,获得最新详情的链接。
)
许多独立软件供应商(ISVs,independentsoftwarevendors)采用SpringSecurity,是因为它拥有丰富灵活的验证模型。
这样,无论终端用户需要什么,他们都可以快速集成到系统中,不用花很多功夫,也不用让用户改变运行环境。
如果上述的验证机制都没有满足你的需要,SpringSecurity是一个开放的平台,编写自己的验证机制是十分简单的。
SpringSecurity的许多企业用户需要整合不遵循任何特定安全标准的“遗留”系统,SpringSecurity在这类系统上也表现的很好。
有时基本的认证是不够的,有时你需要根据在主体和应用交互的方式来应用不同的安全措施。
比如,为了保护密码,不被窃听或受到中间人攻击,希望确保请求只通过HTTPS到达。
这在防止暴力攻击保护密码恢复过程特别有帮助,或者简单的,让人难以复制你的系统的关键字内容。
为了帮助你实现这些目标,SpringSecurity完全支持自动“信道安全”,整合jcaptcha一体化进行人类用户检测。
SpringSecurity不仅提供认证功能,也提供了完备的授权功能。
在授权方面主要有三个领域,授权web请求,授权被调用方法,授权访问单个对象的实例。
为了帮你了解它们之间的区别,对照考虑授在Servlet规范web模式安全,EJB容器管理安全,和文件系统安全方面的授权方式。
SpringSecurity在所有这些重要领域都提供了完备的能力,我们将在这份参考指南的后面进行探讨。
1.2. 历史
SpringSecurity开始于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组合项目,被更名为“SpringSecurity”。
现在,SpringSecurity成为了一个强大而又活跃的开源社区。
在SpringSecurity支持论坛上有成千上万的信息。
有一个积极的核心开发团队专职开发,一个积极的社区定期共享补丁并支持他们的同伴。
1.3. 发行版本号
了解springSecurity发行版本号是非常有用的。
它可以帮助你判断升级到新的版本是否需要花费很大的精力。
我们使用apache便携式运行项目版本指南,可以在以下网址查看http:
//apr.apache.org/versioning.html。
为了方便大家,我们引用页面上的一段介绍:
“版本号是一个包含三个整数的组合:
主要版本号.次要版本号.补丁。
基本思路是主要版本是不兼容的,大规模升级API。
次要版本号在源代码和二进制要与老版本保持兼容,补丁则意味着向前向后的完全兼容。
”
1.4. 获得SpringSecurity
你可以通过多种方式获得SpringSecurity。
你可以下载打包好的发行包,从Spring的网站下载页,下载单独的jar(和实例WAR文件)从Maven中央资源库(或者SpringSourceMaven资源库,获得快照和里程碑发布)。
可选的,你可以通过源代码创建项目,参考项目网站获得更多细节。
1.4.1. 项目模块
在SpringSecurity3.0中,项目已经分割成单独的jar,这更清楚的按照功能进行分割模块和第三方依赖。
如果你在使用Maven来构建你的项目,你需要把这些模块添加到你的pom.xml中。
即使你没有使用Maven,我们也推荐你参考这个pom.xml文件,来了解第三方依赖和对应的版本。
可选的,一个好办法是参考实例应用中包含的依赖库。
1.4.1.1. Core-spring-security-core.jar
包含了核心认证和权限控制类和接口,运程支持和基本供应API。
使用SpringSecurity所必须的。
支持单独运行的应用,远程客户端,方法(服务层)安全和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安全架构代码。
任何需要依赖servletAPI的。
你将需要它,如果你需要SpringSecurityWeb认证服务和基于URL的权限控制。
主包是org.springframework.security.web。
1.4.1.3. Config-spring-security-config.jar
包含安全命名控制解析代码(因此我们不能直接把它用在你的应用中)。
你需要它,如果使用了SpringSecurityXML命名控制来进行配置。
主包是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
SpringSecurity的CAs客户端集成。
如果你希望使用SpringSecurityweb认证整合一个CAS单点登录服务器。
顶级包是org.springframework.security.cas。
1.4.1.7. OpenID-spring-security-openid.jar
OpenIDweb认证支持。
用来认证用户,通过一个外部的OpenID服务。
org.springframework.security.openid。
需要OpenID4Java。
1.4.2. 获得源代码
SpringSecurity是一个开源项目,我们大力推荐你从subversion获得源代码。
这样你可以获得所有的示例,你可以很容易的建立目前最新的项目。
获得项目的源代码对调试也有很大的帮助。
异常堆栈不再是模糊的黑盒问题,你可以直接找到发生问题的那一行,查找发生了什么额外难题。
源代码也是项目的最终文档,常常是最简单的方法,找出这些事情是如何工作的。
要像获得项目最新的源代码,使用如下subversion命令:
svncheckout
你可以获得特定版本的源代码
Chapter 2. Security命名空间配置
2.1. 介绍
从Spring2.0开始可以使用命名空间的配置方式。
使用它呢,可以通过附加xml架构,为传统的springbeans应用环境语法做补充。
你可以在spring参考文档得到更多信息。
命名空间元素可以简单的配置单个bean,或使用更强大的,定义一个备用配置语法,这可以更加紧密的匹配问题域,隐藏用户背后的复杂性。
简单元素可能隐藏事实,多种bean和处理步骤添加到应用环境中。
比如,把下面的security命名元素添加到应用环境中,将会为测试用途,在应用内部启动一个内嵌LDAP服务器:
ldap-server/>
这比配置一个Apache目录服务器bean要简单得多,最常见的替代配置需求都可以使用ldap-server元素的属性进行配置,这样用户就不用担心他们需要设置什么,不用担心bean里的各种属性。
使用一个良好的XML编辑器来编辑应用环境文件,应该提供可用的属性和元素信息。
我们推荐你尝试一下SpringSource工具套件因为它具有处理spring组合命名空间的特殊功能。
要开始在你的应用环境里使用security命名空间,你所需要的就是把架构声明添加到你的应用环境文件里:
//www.springframework.org/schema/beans"
xmlns:
security="http:
//www.springframework.org/schema/security"
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="http:
//www.springframework.org/schema/beans
http:
//www.springframework.org/schema/beans/spring-beans-3.0.xsd
http:
//www.springframework.org/schema/security
http:
//www.springframework.org/schema/security/spring-security-3.0.xsd">
...
在许多例子里,你会看到(在示例中)应用,我们通常使用"security"作为默认的命名空间,而不是"beans",这意味着我们可以省略所有security命名空间元素的前缀,使上下文更容易阅读。
如果你把应用上下文分割成单独的文件,让你的安全配置都放到其中一个文件里,这样更容易使用这种配置方法。
你的安全应用上下文应该像这样开头
beansxmlns="http:
//www.springframework.org/schema/security"
xmlns:
beans="http:
//www.springframework.org/schema/beans"
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="http:
//www.springframework.org/schema/beans
http:
//www.springframework.org/schema/beans/spring-beans-3.0.xsd
http:
//www.springframework.org/schema/security
http:
//www.springframework.org/schema/security/spring-security-3.0.xsd">
...
beans>
就在这一章里,我们都将假设使用这种语法。
2.1.1. 命名空间的设计
命名空间被用来设计成处理框架内最常见的功能,提供一个简化和简洁的语法,使他们在一个应用程序里。
这种设计是基于框架内的大型依赖,可以分割成下面这些部分:
∙Web/HTTP安全-最复杂的部分。
设置过滤器和相关的服务bean来应用框架验证机制,保护URL,渲染登录和错误页面还有更多。
∙业务类(方法)安全-可选的安全服务层。
∙AuthenticationManager-通过框架的其它部分,处理认证请求。
∙AccessDecisionManager-提供访问的决定,适用于web以及方法的安全。
一个默认的主体会被注册,但是你也可以选择自定义一个,使用正常的springbean语法进行声明。
∙AuthenticationProviders-验证管理器验证用户的机制。
该命名空间提供几种标准选项,意味着使用传统语法添加自定义bean。
∙UserDetailsService-密切相关的认证供应器,但往往也需要由其他bean需要。
下一章中,我们将看到如何把这些放到一起工作。
2.2. 开始使用安全命名空间配置
在本节中,我们来看看如何使用一些框架里的主要配置,建立一个命名空间配置。
我们假设你最初想要尽快的启动运行,为已有的web应用添加认证支持和权限控制,使用一些测试登录。
然后我们看一下如何修改,使用数据库或其他安全信息参数。
在以后的章节里我们将引入更多高级的命名空间配置选项。
2.2.1. 配置web.xml
我们要做的第一件事是把下面的filter声明添加到web.xml文件中:
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
这是为SpringSecurity的web机制提供了一个调用钩子。
DelegatingFilterProxy是一个SpringFramework的类,它可以代理一个applicationcontext中定义的Springbean所实现的filter。
这种情况下,bean的名字是"springSecurityFilterChain",这是由命名空间创建的用于处理web安全的一个内部的机制。
注意,你不应该自己使用这个bean的名字,一旦你把这个添加到