实战springsecurity3.x:快速构建企业级安全_第1页
实战springsecurity3.x:快速构建企业级安全_第2页
实战springsecurity3.x:快速构建企业级安全_第3页
实战springsecurity3.x:快速构建企业级安全_第4页
实战springsecurity3.x:快速构建企业级安全_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实战Spring Security 3.x :快速构建企业级安全罗时飞著http:/www.ope n-2010年3月25日【版权所有、侵权必究】序VII前言IX1 企业级安全概述11.1 传统JavaEE安全性编程模型的局限性 .11.1.1 可移植性差 11.1.2 企业级能力差 21.1.3 不便于实施集成测试或 CI工作 31.1.4 Spring Security 成功挑战Java EE安全性编程模型 31.2 揭秘 SpringSecurity 基于过滤器链的设计同 Web容器解耦的重要法宝 41.2.2 构建在Spring基础之上 41.2.3 Spri ng Se

2、curity 内置的企业级特性集合 51.3 小结5.2 触动 Spring Security 3.0 72.1 下载 SpringSecurity发布包72.2 运行及分析内置的 SpringSecurity Tutorial Application 示例72.2.1 运行 Spring Security Tutorial Application示例 72.2.2 分析 Spring Security Tutorial Application示例 92.3 运行及分析内置的 ContactsSampleApplication示例.102.3.1 运行 Con tacts Sample App

3、licatio n示例 102.3.2 分析 Con tacts Sample Applicatio n示例 122.4 下载持续更新的 SpringSecurity源码132.5 小结133 Spring Security内置的JavaEE应用认证支持 143.1 安全性认证概述 143.1.1 安全也是矛盾的统一体 143.2 内置的HTTPBASIC认证支持 153.2.1 不够安全的HTTP BASIC认证 163.3 内置的HTTPDigest认证支持163.3.1 安全的 HTTP Digest 认证 183.3.2 对库中用户密码进行 MD5加密存储 183.3.3 有关 Dig

4、estAuthenticationEntryPoint的更多细节 193.4 内置的HTTP表单认证支持 203.4.1 灵活控制登录时页面的跳转逻辑 213.4.2 定制HTTF登录表单的处理URL 213.5 内置的X.509认证支持213.5.1 设置HTTP与HTTPS端口间的映射关系 243.5.2 如何从X.509证书中抽取用户名 243.5.3 启用单向X.509认证 253.6 小结254 分享 Spring Security认证支持背后的故事 264.1 过滤器链的形成264.1.1 从 springSecurityFilterChain过滤器谈起 264.1.2 若干重要策

5、略接口 264.2 匿名认证264.3 Remember Me 认证服务264.4 控制并发 HttpSession264.5 切换用户274.6 自定义退出逻辑274.7 小结275 集成及管理认证信息285.1 认证提供者核心策略接口 285.2 处在内存中的认证信息 285.3 处在关系数据库中的认证信息 285.4 借助LDAP服务器管理认证信息285.5 基于JAAS管理认证信息 285.6 小结286 Spring Security内置的 JavaEE应用授权支持 296.1 授权策略296.2 针对 Web资源的授权支持 296.3 针对业务方法的授权支持296.4 小结297

6、针对领域对象的授权支持307.1 何谓领域对象307.2 小结308 集成单点登录及单点退出解决方案 318.1 何谓单点登录及单点退出 318.2 Spring Security对 SSO的集成支持 318.2.1 JA-SIG CAS 318.2.2 OpenID 318.3 小结319 探索及集成JASIGCAS 329.1 JASIGCAS概述329.1.1 SAML 329.2 小结3210 探索及集成OpenID 3310.1 Ope nID 概述3310.2 小结3311 探索及集成 Kerberos/SPNEGQ 3411.1 Kerberos/SPNEGO概 述3411.2

7、小结3412 Spring Security 3.x高级专题及最佳实践 3512.1 重新审视安全性话题3512.2 同用户认证相关话题3512.3 同用户授权相关话题3512.4 小结3513 附录A: JavaEE容器内置的JavaEE安全性支持 3613.1 ApacheTomcat6.0 内置的 JavaEE安全性支持3613.1.1 HTTP BASIC认证 3613.1.2 HTTP Digest 认证 3713.1.3 HTTP表 单认证 3913.1.4 准备 X.509 证书 3913.1.5 双向 X.509 认证 4413.2 EclipseJetty 7.0 内置的 J

8、avaEE安全性支持4513.3 JBoss6.0内置的JavaEE安全性支持 4513.4 OracleWebLogic11g 内置的 JavaEE安全性支持4513.5 IBMWebSphere7.0 内置的 JavaEE安全性支持4514 附录B: Spring Security内置的命名空间 4614.1 <http/> 命名空间.4614.2 <authentication manager/>命名空间4614.3 <global method security/>命名空间4615 附录C:同Apache HTTPServer相关的话题 4715.1

9、 Apache HTTPServer 概述4715.1.1 配置 CA X.509 证书 4715.2 Apache HTTPServer与 CAS的整合4715.2.1 mod_auth_cas 模块 4715.3 将 ApacheHTTPServer作为 JavaEE容器的前端4715.3.1 激活负载均衡 4716 附录 D: Spring LDAP. 4816.1 LDAP概 述4816.1.1 LDAP服务器 4816.2 第三方LDAP客户端工具4816.2.1 JXplorer 4816.2.2 Apache Directory Studio 4816.3 深入到 SpringL

10、DAP中4816.3.1 LdapTemplate 核心类 4816.3.2 内置的LDAF连接池支持 4816.3.3 事务补偿特性 4917 附录E:相关资料 5017.1 图书50网站50VII序序为了在软件产品中启用 Java EE容器安全性,我们往往要付出很大代价,因为Java EE容器内置的安全性支持存在诸多重大缺点,尤其是它的可移植性、企业级能力差、难于展开各类集成测试工作等缺陷,很多企业应用因为这些问题而转向了Spring Security。过去的多年中,基于Spring的Spring Security博得了企业用户的欢心。无论是在其内部架构,还是功能方面,它都照顾到多方面的利

11、益,几乎可以用“艺术美”形容它。从内部架构看,采纳 Spring及基于它的架构能够很大程度解决企业应用的可移植性问题。事实上,Spring Security确实是基于 Spring架构的,同一 Spring Security使能应用可以 部署到任意Java EE容器中。这一点在如今苛刻的企业部署环境显得格外重要。值得注意的 是,基于Spring Security研发的企业应用能够顺利进行各种集成测试工作,包括CI工作的开展。从功能上看,Spring Security尽可能不重复发明轮子。在很多场合,它尽量集成现有的、 业界领先的安全性解决方案,比如JA-SIG CAS、OpenID、Kerbe

12、ros。如果某些企业级特性非常重要,而又没有现成的做法,则它会基于开放标准(或事实上的标准)提供它们,比如 领域对象授权。在一定场合,某些企业应用可能需要扩展 Spring Security。它也是欢迎的,毕竟开放架 构、开源协同工作等是开源项目最基本的行为。因此,我们没有理由不选择Spri ng Security去实施、加强企业应用的安全性。自从Spring Security (Acegi)诞生的那天起,我们便开始采纳它,各种软件产品、企业 应用中都有它的身影。我们希望过去积累的Spring Security经验、教训能够积累下来,并跟进持续发展的最新版Spring Security,便萌发

13、了此书的写作计划。虽然本书的主题是围绕Spring Security展开的,但我们更希望它是一本指导企业用户(包括开发者)如何实施企业 级安全不可或缺的重要图书。当然,Spring Security涉及的知识面非常广,加上本人经验有限,书中难免出现错误, 还望同行批评指正,并提出各种宝贵写作建议。罗时飞E_mail : luoshifei2009年于广州IX前言、八,、*刖言安全,安全,还是安全,全书都将围绕这一重要话题展开论述。借助Spring Security ,我们能够快速构建企业级安全。有关Spring Security、企业级安全话题的探讨,全书将一一道来。我们将各章的主体内容安排如

14、下。第1章,企业级安全概述。主要围绕Java EE安全性编程模型展开,并试图将SpringSecurity带入到开发者的视野中。第2章,触动Spring Security 3.0。动手实践它,并获得感性认识。第3章,Spring Security 内置的Java EE应用认证支持。本章内容将围绕SpringSecurity 内置的 HTTP BASIC 认证、X.509 认证、HTTP 表单认证、HTTP Digest 认 证展开论述。实际上,Java EE容器也提供了这些认证支持。第4章,分享Spring Security认证支持背后的故事。如果说第 3章内容揭露了事实 表面的话,则本章内容

15、给出了事实真相。另外, Spring Security还提供了大量的企 业级认证特性,比如 Remember-Me认证服务、控制并发 HttpSession、切换用户、 自定义退出逻辑等,这些内容也将在本章得到深入细致的阐述。第5章,集成及管理认证信息。Spring Security支持将认证信息存储到任意场合,比如RDBMS、LDAP、内存等。第6章,Spring Security内置的Java EE应用授权支持。针对 Web资源、业务方法及领域对象的授权操作,Spring Security提供了极其优美的集成支持,尤其是其"解 耦”行为。第7章,针对领域对象的授权支持。在现有的安

16、全性框架及解决方案中,能够针对领域对象实施授权操作的不多,但Spring Security做到了,而且非常优雅。第8章,集成单点登录及单点退出解决方案。第9章,探索及集成 JA-SIG CAS。第10章,探索及集成 OpenID。第11章,探索及集成 Kerberos/SPNEGO。第12章,Spring Security 3.x高级专题及最佳实践。第13章,附录A,Java EE容器内置的Java EE安全性支持。第14章,附录B, Spring Security内置的命名空间。第15章,附录C,同Apache HTTP Server相关的话题。第 16 章,附录 D, Spring LDA

17、P。第17章,附录E,相关资料。值得注意的是,http:/openv-提供了全书配套代码、脚本的下载,借助如下SVN命令能够将它们下载到D:springsource'ebooks位置。D:springsource>svn cohttp:/openv-ebooks随后,开发者可以使用它们,或在STS中导入各自的代码或脚本,并完成各自运行和调试工作。如果需要不定期更新它们,则可借助如下SVN命令。D:springsourceebooks>svn update任何问题,可以同作者取得联系,谢谢!XII实战Spring Security 3.x :快速构建企业级安全1企业级安全概述

18、需要首先交代的是,本书主要专注于企业级Java安全的研究,尤其是 Spring Security。因此,我们的一切内容会围绕Java EE安全性编程模型及 Spring Security为中心。本章内容将从揭露 Java EE安全性编程模型的缺陷出发,进而将Spring Security弓I入进来。80%的企业级Java应用都会采用Spring Security构建自身的安全性体系。1.1传统Java EE安全性编程模型的局限性在现有的各种安全性架构中,Java (包括Java SE、Java ME、Java EE)平台的安全性架构堪称一流,这也是Java平台的重要卖点。然而,正如顾客购物一样

19、,某一商品的功能多并不表示其受欢迎,因为它的易用性可能存在问题,而这一要素往往是顾客非常看重的一方面。类似地,Java EE平台暴露的Java EE安全性编程模型存在的缺陷很多,而这些缺陷 是迫使开发者、企业转向其它安全性解决方案的重要“推动力”。下面依次讨论列位缺陷。1.1.1可移植性差现如今,无论是商用的 Java EE容器,还是开源 Java EE容器,它们已经逐渐走向同质化。比如,开源领域的Apache Tomcat、Jetty、JBoss、SpringSource dm Server 等;商用领域的Oracle WebLogic、IBM WebSphere (WAS )。同质化,意味

20、着客户 (即部署Java EE 应用的企业)将不再去过多计较自身的生产系统采纳何种Java EE容器,他们会把更多精力放在如何提升各自企业应用本身上。与此同时,只要是企业应用,它们便存在各自的安全性体系架构。架构师、开发者(包括软件企业)需要保证打造的企业应用能够同时宿主到各种Java EE容器中。问题来了,如果采纳传统的Java EE安全性编程模型,则开发者不仅要去调整Java EE容器本身的各种安全性配置,而且他们还可能需要调整自身的企业应用。下面举例说明。当开发者启用Apache Tomcat内置的HTTP BASIC认证支持时,如果简单地将用 户及角色等信息直接存储到文件中,则需要手工

21、修改位于Tomcat conf目录中的tomcat-users.xml配置文件。将来,部署在Tomcat中的企业应用便能够享受到HTTP BASIC认证所带来的安全性支持了。但如果企业决定要替换原有的Web容 器时,比如将Tomcat换成IBM WAS。此时,开发者又要去了解 WAS是如何存 储用户及角色等信息的。在集成业界各种著名第三方安全性解决方案方面,各Java EE容器都有各自的做法,比如 JA-SIG CAS、OpenID、Kerberos/SPNEGO 。借助 Java EE 安全性编程模型较难同它们打交道, 最终开发者很难真正将它们纳入到企业应用的研发工作中。即使能够采纳它们,应

22、用的可移植性也将是一个问题。等等,开发者可以想出其它类似场景。从上述示例能够看出,在采纳传统Java EE 编程模型研发企业应用时,开发者往往需要调整宿主企业应用的Java EE容器中的相关配置文件, 部署环节将变得异常复杂。 这说明,企业应用同Java EE容器耦合在一起,即借助Java EE安全性编程模型研发的企业应用可移 植性差。当企业应用的可移植性差时,我们便不能够敏捷地响应客户、市场变化。1.1.2企业级能力差Java EE容器(包括Java SE平台)内置的企业级特性不少,但要将它们应用到真实的企业应用中,还存在一段距离。具体表现举例如下。在某些场合,即使是同一企业应用,它可能需要

23、同时启用多种不同的认证策略。比如,A类用户(远程桌面用户)需要通过HTTP BASIC 认证,而B类用户(浏览器用户)需要通过HTTP表单认证。如果采纳传统Java EE安全性编程模型,则这 几乎是比"007”还难完成的任务。如何修改同一web.xml能够达到这一目标呢?悬!心、.在Java EE安全性编程模型中,开发者很难看到,匿名认证、Remember-Me认证服务、控制并发 HttpSession、自定义退出逻辑等企业级特性。大量的研发及企业生产告诉我们,这些企业级特性是非常实用、基础的。然而,Java EE安全性编程模型却没有提供。等等,开发者可以想出其它类似场景。因此,能够

24、看出,Java EE安全性编程模型暴露的企业级能力差,不贴近真实的生产。各生产环境存在太多的差异性、不确定性,这些问题不应该直接暴露给开发者。3实战Spring Security 3.x :快速构建企业级安全1.1.3不便于实施集成测试或CI工作一直以来,这是 Java EE安全性编程模型暴露的重要缺陷。现如今,不进行各类软件测试工作的软件团队是极不负责任的。具体表现在如下几方面。研发企业应用期间,开发者较难编写出脱离 Java EE容器的集成测试代码。这主要是因为Java EE应用同Java EE容器耦合在一起。此时,即使开发者能够编写出基 于JUnit/TestNG 的集成测试代码,则必须

25、同时启动Java EE容器,并将这些测试代码部署到容器中才能够见识到这些测试代码的效果。不够敏捷的又一体现。为搭建功能或性能测试环境, 部署或测试人员需要修改 Java EE容器中的不少配置 文件,以满足Java EE安全性编程模型的要求。 试想,如果找到任一 Java EE容器, 直接将企业应用部署到其中, 则整个企业应用的安全性体系即可生效,则这是最好不过的事情。努力寻找这类安全性体系中 因为上述原因,广为业界使用的持续集成(Continuous Integration, CI)设施无法派上用场,或者说不能够最大化CI的价值。几乎可以认为,如果企业应用的各类集成测试工作不能够顺利进行,尤其

26、是被CI自动完成,则研发效率、软件如何交付能力将大打折扣,后果很严重。最终,大量的人力、物力 资源遭到浪费,进而影响到团队斗志。1.1.4 Spring Security成功挑战Java EE安全性编程模型从2006年开始,Spring Security (Acegi )成为了企业级 Java安全性领域的一片旗帜。借助Spring Security构建企业应用的安全性体系期间,我们能够享受到如下优势。应用的可移植性非常好,所有同安全性相关的内容都将内置在应用本身,比如WAR包中。部署这类应用期间,不用去修改目标Java EE容器中同安全性相关的任何配置文件。企业级能力很强,因为 Spring

27、Security 源自实践。作为一开源框架,或者说安全 性平台,其发展速度是传统 Java EE安全性编程模型无法比拟的。比如,在集成第 三方安全性解决方案时、提供各种新的企业级安全性特性时。由于Spring Security 构建在Spring基础上,这使得各类集成测试及CI工作能够上述优势集合说明,Spring Security 优雅地解决了传统 Java EE安全性编程模型存在的 各种致命缺陷。1.2 揭秘 Spring Security开发者可能会问,Spring Security是如何克服传统 Java EE安全性编程模型内置的缺陷 集合呢?下面一一揭露相关内容。 至于具体的使用和实

28、现细节,则需要在日后的实践和阅读 工作中体现。1.2.1基于过滤器链的设计同Web容器解耦的重要法宝在传统Java EE安全性编程模型中,开发者需要在 web.xml中表达HTTP安全性需求。 如果安全性需求非常复杂,而且灵活多变,尤其是要外在化管理它们时,比如借助MySQL数据库动态管理安全性体系,则 web.xml显然是不能够满足此类场景的。考虑到真实企业环境的多样化,Spring Security借助过滤器链(javax.servlet.FilterChain )描述和承载HTTP安全性需求。过滤器链是标准Java EE行为,它由若干过滤器构成。不同过滤器可实现不同HTTP访问控制目的,

29、比如判断HttpSession是否已经创建、当前用户是否已创建了其它 HttpSession等。可以预见,借助过滤器链,开发者可以实现复杂HTTP安全性需求。开发者可能会问, 过滤器需要配置在 web.xml中,如果需要调整 HTTP访问控制,则也 需要不断调整 web.xml。下节内容能够打消您的这种担忧, 因为Spring Security构建在Spring 基础上,过滤器链可以配置在 Spring DI容器中,而且这是 Spring Security的默认行为。1.2.2构建在Spring基础之上Spring 3.0平台在引领 Java EE的未来,Spring Security承载在这

30、一平台上面。上述过滤 器链中各过滤器的配置可以由Spring完成,比如借助 org.springframework.web.filter包中的DelegatingFilterProxy过滤器代理类能够实现这一目的。事实上,Spring Security不仅能够保护 HTTP资源(Web资源),业务方法和领域对象 都是它能够保护的内容。为了保证最小的入侵性,Spring Security启用了 Spring AOP技术实现对业务方法、领域对象的保护。与此同时,Spring针对代码级的集成测试工作提供了一完整的解决方案,这为SpringSecurity顺利实施集成测试工作奠定了良好的基础。1.2.

31、3 Spring Security内置的企业级特性集合Spring Security内置了大量企业级特性,它们或者同Java EE容器内置的安全性支持进行了很好的融合,或者同第三方安全性解决方案进行了很好的整合工作,或者是自身开发的专有特性,或者留出了不少扩展接口供开发者实现新的企业级特性。这些企业级特性目的只有一个,即改善企业应用的安全性、提升研发效率。下面一一列举出它们,排名不分先后。内置了各种 HTTP认证支持,其中包括 HTTP BASIC、HTTP Digest、HTTP表单认 证、HTTP SSL( X.509 )认证。针对Web资源、业务方法、领域对象提供了一整套认证和授权解决方

32、案。Spring Security能够融入到任何类型的企业应用中,无论目标应用是否采用SpringWeb Flow,还是 Spring BalzeDS Integration ,还是 Spring Web Services,还是 Spring Batch,还是普通非Spring桌面应用等。提供了许多JSP标签库,以完成各种认证及授权操作。集成了多种第三方 SSO解决方案,比如 JA-SIG CAS、OpenID、Kerberos/SPNEGO 等。支持 RDBMS、LDAP、XML、.properties 等认证源。兼容于Java EE安全性编程模型,并能够在同一Java EE应用中同时启用

33、SpringSecurity和Java EE安全性编程模型。提供了大量的实用企业级特性,比如匿名认证、Remember-Me认证服务、控制并发HttpSession、自定义退出逻辑、Run-As认证服务等。支持用户在 HTTP和HTTPS传输渠道间动态切换。Spri ng Security 的任意组成部分都可以被替换、扩展。1.3小结Java EE (包括Java SE)平台内置的安全特性集合非常丰富,然而它们暴露给开发者、 企业的客户视图,即安全性编程模型存在诸多缺陷,其中以可移植性差、企业级能力差、难并依此揭开了研究于开展各种集成测试工作为代表。本章围绕这些内容进行了全方位阐述,Sprin

34、g Security 的序幕。下章内容将正式进入到Spring Security实践中。7实战Spring Security 3.x :快速构建企业级安全8实战Spring Security 3.x :快速构建企业级安全2 触动 Spring Security 3.0本章将围绕Spring Security发布包内置的两个 Demo展开论述,开发者将从它们身上获得对Spring Security的感性认识。这里暂时不会去探讨它们的技术细节,本书后续内容负责深入讨论它们。由于这两个Demo内置在Spring Security发布包中,我们还是从下载SpringSecurity发布包开始吧!2.1

35、 下载 Spring Security 发布包 ,这是下载 Spring Security 发布包的入口。图2-1展示了操作示例。Spring Community Downloadsa Spring Frameworko Spring Security匚 Latest GA release' 3 0 2 RELEASEspring-security-3.0.2.尺ELEA3E.zip (shad 17.4 MB>- More »图 2-1 下载 Spring Security比如,一旦下载spring-security-3.02RELEASE.zip 后,便可完成它的解

36、压工作。其中内置了对应的 Jar包集合、源码、两个Demo、文档(包括Javadoc和Referenee Documentation )。F面来依次研究这两个 Demo。2.2 运行及分析内置的 Spring Security Tutorial Application 示 例先来研究 spring-security-samples-tutorial-3.02RELEASE.war 示例应用。2.2.1 运行 Spring Security Tutorial Application 示例直接将 sprin g-security-samples-tutorial-3.0.2.RELEASE.war

37、 拷贝到 Apache Tomcat 的webapps 目录中,即完成 Spring Security Tutorial Application示例应用的部署。启动Tomcat后,将浏览器定位到对应的URL中,开发者便可看到应用的主页,图2-2展示了它。图 2-2 Spring Security Tutorial Application 示例应用的主页单击"Secure page”或"Extremely secure page”页面时,应用会弹出 HTTP登录表单,具体见图2-3所示。图2-3 HTTP 登录表单这一示例应用内置了rod/koala、dianne/emu、s

38、cott/wombat、peter/opal 等用户。它们都 具有“ ROLE_USER ”角色,rod和dianne用户还具有“ ROLE_TELLER ”角色,而rod甚 至还具有“ ROLE_SUPERVISOR ”角色。图2-4展示了 peter用户登录到应用中。Secure PageThis Is 方 由亡todl 风总也 T&U 吐出 ge>t to me If vt be旳.r沁吐吐存也 址 ifauih«titleat4d thisPropcrt i*?®irteid us Itlk 电寻畧g :直ijth螳i 右乜 I i 口n /他Tj*E

39、V-alijc:|<ecc ! -su: henti c-atii kl prcpertyCpeter<sec; amhantl cati mi pf opert尸'话h usmian*, />peter: outhpnti c«ti hi prQperty=" priiiKipuL meblcd* t><sec ! 3U? henti cat ii oa prcpErty-" priiiiipal. aFicaLcitKanLocke-d10 trueHoneLa.口ul图2-4 peter用户登录到应用中注意,只有rod用

40、户才能访问到“ Extremely secure page”页面,因为这一页面要求登录用户具有“ ROLE_SUPERVISOR ”角色。如果其它用户试图访问它,贝UHTTP 403拒绝访问错误会打印出来,见图2-5。£ Apaehe Tomcat/&Q-殳6 - Error report - Windows inlerrtel Exploref: iDCQlhOSt: 3之舛1日塢轲(£】豆雜世I收聲夹鱼I工具柏 RtotHj阪藏.夾凶.Apache Tomcai/6.0.26 - ErorreiporlHTTP Status 403 - Access is de

41、niedlJJsE Status reportSB Access agpm匸hgdigsouiTE fdttEES 氐 CEn杞cE heis衍|口止电仃Rpachej omBt/ H 应巨石图 2-5 peter 用户试图访问"Extremely secure page"页面当用户访问到listAccounts.html页面(图2-6)后,如果希望进行各项业务操作,则应用也会弹出 HTTP登录表单出来。持有 ROLE_SUPERVISOR或ROLE_TELLER 角色的用户才能够进行这些业务操作,即rod和dianne用户。丈啊日卸劉巳醤花世)收歲头再工具屯_骂助凹 冷收

42、祕 區 http:occlhost:8D80/ipfing-security.AccountsHomeID Hui tier Baliuictr OvETclraf I Op er at i cm 吕1rod0.0100. 0-E20 -$5 +$5 +t202diaruic0.010(). I)-J20 -$5 +15 l$203scott0.0100. 07f20 全 4J5 +化?JpelerQ.O100, D-$20 -$5 +|5 +)20L 旳ut图 2-6 listAccounts.html 页面通过单击"Logout ”超链接,当前用户将结束当前HttpSession

43、的生命周期。更多使用细节,读者可以操作体验一下。2.2.2 分析 Spring Security Tutorial Application 示例这一应用借助 Spring Web MVC 实现展现层,安全性管理工作交给了Spring Security 。从上节能够了解到,这一示例应用同时启用了Spring Security内置的Web资源和业务方法的安全性支持,即认证和授权功能。比如,/secure/index.jsp、/secure/extreme/index.jsp便是Web资源,它们是面向 HTTP用户的。透过位于 WEB-INF中的applicationContext-security

44、.xml 配置文件能够看到,它持有如下内容。<intercept-url/>元素能够控制用户对Web资源的访问操作,这里使用到Spring EL表达式语言。<intercept-url pattern="/secure/extreme/*" access="hasRole('ROLE_SUPERVISOR"/><intercept-url pattern="/secure/*" access="isAuthenticated()"/><intercept-url p

45、attern="/*" access="permitAll"/>大家是否注意到,listAccounts.html页面允许匿名用户(未认证用户)访问,但一旦他 们打算操作相应的业务操作时,HTTP登录表单便会出现。如果分析应用的源代码,读者会发现,bigbank.BankService接口的post()方法签名如下,在listAccounts.html页面进行业务操 作时会调用到这一业务方法。PreAuthorize是Spring Security内置的、用于保护业务方法的重要注解。PreAuthorize ("hasRole('

46、 ROLE_SUPERVISOR or " +"hasRole(' ROLE_TELLER) and 併 account.balance + #amount >= -#account.overdraft)") public Account post(Account account, double amount);更多Spring Security使用细节,我们将在后续内容中一一阐述。2.3运行及分析内置的 Con tacts Sample Applicatio n 示例再来研究 spring-security-samples-contacts-3.0

47、.2.RELEASE.war 示例应用。2.3.1 运行 Con tacts Sample Application 示例直接将 spring-security-samples-contacts-3.0.2.RELEASE.war 拷贝到 Apache Tomcat 的web apps目录中,即完成 Con tacts Sample Applicatio n示例应用的部署。启动Tomcat后,将浏览器定位到对应的URL中,开发者便可看到应用的主页,图2-7展示了它。图 2-7 Contacts Sample Application 示例应用的主页当单击“ Manager”或“ Debug”超链接

48、时,浏览器会将用户带到登录页面,图2-8所示。图 2-8 登录 Contacts Sample Application图2-9展示了 rod用户登录到debug.jsp页面的情形,这一页面展示了当前登录用户的相 关信息,比如持有的角色集合等。图 2-9 /secure/debug.jsp 页面图2-10展示了 bill用户访问/secure/index.htm页面的情形。M34 J km* Rhlctt 罕 Bob JrhxnanLinZii triML 2(. Jtre E=Ti«|a3-23 ttliadm Ln*24 BAaada Ha让an s 曰mh el » P

49、UL£p Btikl35 JkFF IcAIf-iujhiL J Lp*bcwi. raa iraFfllK虫pine, ub:MllaMjstvum. can I nUfeciHn- cat JtnHkK I iunrl:. e leLinsLant.m l«LL ndml m ce:L Adiirj Frztximjw ?d Fnvaaaaf You ConhacH -rrlarrwr 1 yMaw.101 Xl上J"理KiJP土七F:止IE «!.- 吐伫1创 ±Air 吧戸 啧 HA |j i>Xbill* s Contacts1

50、5实战Spring Security 3.x :快速构建企业级安全盟Cma=hi«3 "I士.自3i Liaa V1L31m42 4=i世 UE*HIfTMC-U! Ifl5 JM Sh« Fh£Lip H4a <r 呻 cmiLaadhfilLi as- ihh 曲osiJMl迫L说di 讯 fftkf 运 E.4»jhiLJ L|#iTinirihh liA JenLVthiL gIcL A-iuri Ffebjuijwi $LF ezul .j'.ML Mfciri FcEauBijOB:tI hvi- I#实战Spring

51、 Security 3.x :快速构建企业级安全#实战Spring Security 3.x :快速构建企业级安全1用.11胆 (! u clwirian£«3 n 'tBDfcLr)#实战Spring Security 3.x :快速构建企业级安全#实战Spring Security 3.x :快速构建企业级安全图 2-10 /secure/index.htm 页面2.3.2 分析 Con tacts Sample Application 示例Spring Web MVC用来实现这一 Web示例的展现层,与此同时, Spring Security接管了 相应的安全

52、性控制。 同Spring Security Tutorial Application 示例应用相比,这一 Demo的如下 几方面同它存在重大差异。其一,Contacts Sample Application示例启用了 Spring Security内置的领域对象安全性支 持,applicati onCon text-com mon-authorizati on. xml酉己置文件证实了这一点,本书后续章节会深入阐述到它。针对领域对象提供安全性支持,这是一项重要的企业级特性。其二,将认证信息存储到HSQLDB 数据库中,applicationContext-common-business.xml

53、配置文件说明这一切, 其定义的“ dataSource"受管Bean定义了数据源,而DataSourcePopulator 实用类初始化了这一数据库,它同时持有业务资料库。其三,Con tacts Sample Applicati on 示例的登录表单是由应用自身提供的,即logi n.jsp。在 Spring Security Tutorial Application 示例中,HTTP 登录表单是由 Spring Security 提供的, 下面摘录了 即plicationContext-security.xml配置文件中的相关片段。vform-login login-page=&

54、quot;/login.jsp"authentication-failure-url="/login.jsp?login_error=1"/>如果开发者屏蔽掉这段配置,则同样可以使用这一示例。此时,登录凭证的收集工作将 改成HTTP BASIC认证,而不再是 HTTP表单认证。图2-11展示了 HTTP BASIC认证的使用。图2-11 启用HTTP BASIC 认证更多Spring Security使用细节,我们将在后续内容中一一阐述。2.4下载持续更新的Spring Security源码目前,Spring Security项目存储在 Git配置库中。借助

55、如下Git命令行,能够获得最新的项目源码。git clone git://spring-security/spring-security.git这里面存在Spring Security发布包没有包括的内容,尤其是有很多Demo,供开发者学习、参考。2.5小结Spring Security建立了感性认识。从下章开始,我们将系统性透过本章内容,开发者对研究 Spring Security。3 Spring Security内置的Java EE应用认证支持收集登录用户的凭证策略多种多样,比如HTTP表单、BASIC认证、X.509 CA证书、HTTP Dige

56、st,甚至包括 SSO等策略。本章将专注 4种常见的Java EE应用认证机制。3.1安全性认证概述假设一下:使用网银系统不用用户帐号、进出候机大厅不用安检。这些都是很危险的行为。很显然,加强安全性管理显得格外重要。因此,类似地,企业级系统都应该要求用户登 录(认证),至于登录的方式或策略,则需要依据实际情况操作。对于企业级Java应用而言,Java EE规范规定了若干种认证策略,比如HTTP表单、BASIC认证、X.509 CA证书、HTTP Digest。各Java EE容器必须内置这些认证支持。与此同时,Spring Security也内置了这些认证支持。开发者可能会问,既然 Java EE容器必须内置这些认证机制,Spring Security为什么要重复发明轮子。原因很简单,如果企业应用采用Java EE容器内置的安全性支持,则应用的可移植性和灵活性将很差,相反,Spring Security使能应用的可移植性和灵活性能够得到保证。还记得我们在第2章演示的那两个 Demo吧,我们在部署它们期间,几乎没有修改Apache Tomcat的任何内容。有关Java EE容器内置

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论