欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    SaaS 应用程序实例java版.docx

    • 资源ID:3327232       资源大小:42.70KB        全文页数:23页
    • 资源格式: DOCX        下载积分:12金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    SaaS 应用程序实例java版.docx

    1、SaaS 应用程序实例java版保护多承租 SaaS 应用程序用 Spring Security 和 Apache Directory Server 进行身份验证和授权Massimiliano Parlione, 解决方案架构师, EMCChico Charlesworth, 高级 Java 开发人员, EMC简介:软件即服务(Software as a Service,SaaS)应用程序多承租的性质决定了安全性是一个关键的问题。本文介绍了一个保护多承租 Java应用程序的可行的、实用的方法,即结合使用开源 Spring Security 框架和 Apache Directory Server

    2、。作者通过一个多承租示例 Web 应用程序来展示这个方法。本文的标签:安全,应用开发,开放源码企业中的 SaaS这些年 SaaS 开始繁荣起来了。越来越多的公司都转向这个随需应变的解决方案来更快地响应业务需求,降低成本。Forrester Research 于 2007 年进行的一项调查发现,有 16% 的大型企业和 15% 中小型企业都在使用 SaaS。而且每年分别以 33% 和 50% 的速度增长(参见参考资料)。事实上,根据Saugatuck Technology,2008 年 5 月的统计,“到 2012 年时,超过 100 个员工的商业组织会有 70% 以上已经配备了至少一个 Saa

    3、S 应用程序”。SaaS 能够提供宿主的软件应用程序,并且可能向未开发市场领域提供服务,从而使服务供应商实现规模经济。SaaS 的多承租的最大优点是:它允许服务供应商向多个客户机组织提供服务(参见参考资料)。在 SaaS 应用程序中有很多用户共享相同的资源,所以保护它的最好的方法就是对数据和配置(基于承租者 ID)进行逻辑分区,从而确保多承租的安全。本文展示了如何实现第一道有效防线来保护基于 Java 的多承租 SaaS 应用程序。该解决方案结合使用了 Spring Security(一个经久不衰的开源安全框架)和 Apache Directory Server(一个基于 Java 的流行服务

    4、器,它是开源的并且遵从 Lightweight Directory Access Protocol v3,即 LDAP v3)。本文提出的解决方案是一个示例 Java Web 应用程序,它既可以部署到 Apache Tomcat,也可以部署到 Apache Geronimo。本文重点介绍 SaaS 模型内的身份验证和授权机制。其他有关 SaaS 安全性的概念和技术 比如数据保密与隔离、法规、审计和密码等,超出了本文的范围。多承租的 SaaS 应用程序中的身份验证与授权身份验证和授权是现实应用程序的安全性概念中主要的两个: 身份验证允许一个应用程序在连接时验证一个人(或一个应用程序、智能卡等)是

    5、否与它声明的一样。 授权定义一个用户在一个系统上的权利与权限。用户身份验证通过之后,授权会决定该用户在系统上有权做什么。因此,授权应该发生在身份验证之后。身份验证和授权在 SaaS 应用程序中很复杂。在一个安全性 SaaS 解决方案中,底层的身份验证和授权基础设施有两种设计方法:集中式或联邦式。本文提出的解决方案使用集中式身份验证系统(LDAP 服务器)。集中式的身份验证系统并不排除支持分布式目录的可能性,分布式目录储存了可以分区和复制的信息。本文不考虑采用另一种分散式处理方法,即联邦身份管理。在 SaaS 领域用联邦身份管理会给安全性带来很多新的挑战。(典型的用例会涉及到跨域、基于 Web

    6、的单点登录、跨域用户帐户供应、跨域授权管理和跨域用户属性交换等。详细信息请参见参考资料,里面的文章链接 “Meeting the SaaS Security Challenge” 有详细的解释)。回页首Spring Security 简介Spring Security:比 Acegi 的功能更强大Spring Security 从 2003 年开始作为 Spring 的 Acegi Security System,直到 2007 年年末它才成为一个官方的 Spring 项目,并重命名为 Spring Security。我们推荐使用 Spring Security(而不是 Acegi)有以下几点

    7、原因: 它具备 Acegi 的所有优点,并且有额外的优点。 它利用自定义 Spring 2.0 配置名称空间。 复杂的安全性细节现在隐藏在更简单的 XML 配置之后。 它具有自动配置的能力。在默认情况下,Java Enterprise Edition(Java EE)5 安全机制不支持承租者 ID(tenant ID)等自定义属性,不管它们是什么样的验证者类型(basic,form,digest 或 client certificate)。要支持多承租就必须要实现自定义的解决方案。在本文中,我们将展示如何使用 Spring Security 来构建这样的解决方案。Spring Security

    8、 提供了一个综合的安全解决方案,这个方案大大地简化了在 Java EE 应用程序中开发安全措施的工作。它提供了更高级的摘要,能够让您插入不同的身份验证模型,同时还支持丰富的身份验证功能。此外,它还在不同的应用程序服务器之间提供了高度可移植性。Spring Security 有以下特性: 声明性安全性 支持各种身份验证和授权机制,如 basic、form、digest、JDBC 和 LDAP 支持方法级别的安全性以及 JSR-250 安全性注释 支持单点登录 支持容器集成 支持匿名对话、并行对话、remember-me、通道加强等本文的重点是直接集成 Spring Security 和 LDAP

    9、。其他的部署场景可能会考虑到其他的方法,如 Java 身份验证和授权服务(Java Authentication and Authorization Service,JAAS),或者是由 Spring Security 框架提供的容器适配器进行的容器管理身份验证。回页首LDAP 与 Apache Directory 概述在企业中,管理用户和角色的常见方法是使用 LDAP 服务器。有几个开源的商业 LDAP 解决方案可供选择(参见参考资料)。考虑到有些读者可能不熟悉 LDAP 或 Apache Directory Server,接下来我们对其进行概述。LDAP 的核心LDAP 本质上就是一个数据

    10、库。但它趋向于包含更多描述性的、基于属性的信息。由于 LDAP 目录中的信息的读多于写,所以 LDAP 被设计为读最优化。最常见的例子就是电话簿,它里面的每一人都附有地址和电话号码。作为身份验证和授权源,LDAP 与关系数据库管理系统性相比有以下优点: 有线协议;无需驱动器 灵活的模式 以身份为中心o 身份验证、授权和审计o 组o 安全性(密码、证书)Apache Directory Server 的核心Apache Directory Server 是一个可嵌入的、可扩展的、遵从标准的开源 LDAP 服务器,它由 Java 语言编写而成。我们为本文的解决方案选择 Apache Directo

    11、ry Server 的理由是它的简单性,因为它是一个纯 Java 实现。对于现实中的应用程序,您一定要正确衡量哪一个 LDAP 解决方案最符合您的业务和技术需求。Apache Directory 项目提供了一个 Apache Directory Server,它遵从 LDAP v3 和 Apache Directory Studio,后者是一组基于 Eclipse 的目录工具(参见参考资料)。回页首在多承租的环境中集成 Spring Security 和 Apache Directory Server在一般情况下,配置 Spring Security 使其能够协同 LDAP 服务器进行工作很简

    12、单。虽然在多承租的环境中集成它们也相对容易,但还是比一般情况复杂些。我们首先论述如何在 Apache Directory Server 中创建一个多承租用户注册表,然后再展示一个动态 LDAP 路由解决方案如何为一个有效的多承租安全性解决方案提供便利。多承租 Apache Directory Server 用户注册表本小节描述一个示例多承租用户注册表,它由两个安全性区域组成,名为 tenant1 和 tenant2,每一区域个都有两组不同的用户:管理员和访问者。每一组都链接着许多用户,这些用户共用一个特定角色,而且都属于该组的相应安全区域。不同区域的用户凭证储存于一个 Apache Direc

    13、tory Server 用户注册表中,位于不同的子树下,如图 1所示。将不同的 LDAP 后缀分配给不同的安全区域。例如,tenant1 的基本专有名称(Base Distinguished Name,DN)是 dc=tenant1, dc=com,tenant2 的基本 DN 为 dc=tenant2, dc=com。图 1. 多承租 LDAP 用户注册表示例然后,不同的用户组(在现实中转换成了用户角色)会被分配到对应的每一个安全区域。例如,组 cn=adm, ou=groups 和组 cn=gst, ou=groups(分别转换成管理员和访问者)属于基本 DN 为 dc=tenant1,

    14、dc=com 的 tenant1 安全区域。反过来,不同的用户条目与一个特定安全区域下的特定组相关联。例如,用户 uid=tenant1admin, ou=people 被赋予管理员的角色 cn=adm, ou=groups ,属于安全区域 dc=tenant1, dc=com。一定要在 Apache Directory Server 中的 server.xml 配置文件(Apache Directory Server Install Directory/instances/default/conf/server.xml)中为图 1中的每一个安全区域创建一个新的分区和安全上下文条目,如清单 1

    15、所示:清单 1. Apache Directory Server 的 server.xml 文件 . #tenant1ContextEntry . newEntry objectClass: top objectClass: domain objectClass: extensibleObject dc: tenant1 dc=tenant1,dc=com . 同样地,要像 tenant1 那样为 tenant2 添加一个新的分区和安全性上下文条目。示例 Web 应用程序中有一个简单的示例 .server.xml 文件。创建了安全区域后,就可以使用 LDIF Import Wizard Apa

    16、che Directory Studio Eclipse 插件中的特色工具(参见参考资料) 将类似于清单 2中的 LDAP Date Interchange Format(LDIF)文件的内容导入到其相应的安全性区域中。示例 Web 应用程序提供示例 LDIF 文件。清单 2. tenant1_users.ldif dn: ou=groups,dc=tenant1,dc=com objectclass: top objectclass: organizationalUnit ou: groups dn: ou=people,dc=tenant1,dc=com objectclass: top

    17、objectclass: organizationalUnit ou: people dn: uid=tenant1admin,ou=people,dc=tenant1,dc=com objectclass: top objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson cn: tenant1admin sn: tenant1admin uid: tenant1admin userPassword: tenant1admin dn: uid=tenant1guest,ou=people,

    18、dc=tenant1,dc=com objectclass: top objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson cn: tenant1guest sn: tenant1guest uid: tenant1guest userPassword: tenant1guest dn: cn=gst,ou=groups,dc=tenant1,dc=com objectclass: top objectclass: groupOfNames cn: gst member: uid=ten

    19、ant1guest,ou=people,dc=tenant1,dc=com dn: cn=adm,ou=groups,dc=tenant1,dc=com objectclass: top objectclass: groupOfNames cn: adm member: uid=tenant1admin,ou=people,dc=tenant1,dc=comSpring Security 的动态 LDAP 路由动态 LDAP 路由的原理是在运行时根据查找密钥动态地选择 LDAP 安全性上下文的可能性(参见图 2)。在一个多承租环境中,这针对一个 LDAP 源(根据承租者的 ID 动态生成)转换

    20、成身份验证和授权。图 2. 多承租动态 LDAP 路由Spring 本身不提供动态 LDAP 路由,所以需要亲自构建。我们的想法受到类似解决方案 Spring 的AbstractRoutingDataSource(参见参考资料)的启发。我们通过封装三个主要的类来实现动态 LDAP 路由: 清单 3中所示的AbstractRoutingSpringSecurityContextSource是一个抽象的实现,它基于 Spring 的LdapContextSource类。它引用一组 “真实的” 安全性上下文源(参见targetSpringSecurityContextSources),它的目的是根据

    21、固定的查找密钥将调用路由到众多的目标安全性上下文源之一(参见getResolvedContextSource())。清单 3. AbstractRoutingSpringSecurityContextSource.java public abstract class AbstractRoutingSpringSecurityContextSource extends LdapContextSource implements SpringSecurityContextSource, InitializingBean private Map targetSpringSecurityContextS

    22、ources; /* Determine the current lookup key. This will typically be implemented to check a thread-bound context. */ protected abstract T determineCurrentLookupKey(); /* Determine the real security context source dynamically at runtime based upon a lookup key. */ protected DefaultSpringSecurityContex

    23、tSource getResolvedContextSource() T lookupKey = determineCurrentLookupKey(); DefaultSpringSecurityContextSource springSecurityContextSource = this.targetSpringSecurityContextSources.get(lookupKey); if (springSecurityContextSource = null) throw new IllegalStateException( Cannot determine target Spri

    24、ngSecurityContextSource for lookup key + lookupKey + ); return springSecurityContextSource; public void setTargetSpringSecurityContextSources( Map targetSpringSecurityContextSources) this.targetSpringSecurityContextSources = targetSpringSecurityContextSources; public void afterPropertiesSet() throws

    25、 Exception if (this.targetSpringSecurityContextSources = null) throw new IllegalArgumentException( targetSpringSecurityContextSources is required); public DirContext getReadWriteContext(String userDn, Object credentials) return this.getResolvedContextSource().getReadWriteContext(userDn, credentials); Override public DirContext getReadOnlyContext() return this.getResolvedContextSource().getReadOnlyContext(); Override public DirContext getReadWriteContext() return this.getReso


    注意事项

    本文(SaaS 应用程序实例java版.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

    经营许可证编号:鄂ICP备2022015515号-1

    收起
    展开