读书人

应用 Acegi 保护 Java 应用程序: 续三

发布时间: 2012-11-01 11:11:32 作者: rapoo

使用 Acegi 保护 Java 应用程序: 续三

本文是 Acegi Security Systerm 介绍的最后一部分(共三部分),Bilal Siddiqui 将向您介绍如何保护对 Java 类实例的访问,从而结束本系列文章。通过本文了解为何需要对 Java? 类的访问进行保护,Spring 如何创建和保护对 Java 类实例的访问以及如何对 Acegi 进行配置以实现 Java 应用程序的类安全性。

这期共分三部分的系列文章介绍了如何使用 Acegi 安全系统保护 Java 企业应用程序。系列文章的 第 1 部分 简单介绍了 Acegi 并解释如何使用其内置的安全过滤器实现一个简单的、基于 URL 的安全系统。第 2 部分 介绍了如何编写访问控制策略并将其保存到一个 LDAP 目录服务器,以及如何配置 Acegi 来与目录服务器进行交互,从而实现访问控制策略。第 3 部分(也是本系列的最后一篇文章)将演示如何在企业应用程序中使用 Acegi 保护对 Java 类实例的访问。

首先我将介绍何时需要对 Java 类访问进行保护,包括文中引用的两个典型企业应用程序场景。之后,我将解释 Spring 的反转控制(IOC)框架如何创建可从 JSP 或 servlet 访问的 Java 类实例。我还将介绍有关 bean 代理 的重要概念,Spring 正是使用它过滤对 Java 类的访问。最后,我将介绍如何对 Acegi 的方法安全性拦截器进行配置以控制对 Java 类的访问。我将对 第 2 部分 中的示例程序进行增强,为实现安全的 Java 对象提供支持,从而结束本系列的最后一篇文章。

?

由于本文的讨论构建在本系列前两部分的内容之上,因此会经常引用到 第 1 部分 和 第 2 部分 中的讨论和示例。因此,在继续阅读本文之前,在其他浏览器窗口中打开前两期文章将有助于理解本文内容。

?


应用 Acegi 保护 Java 应用程序: 续三
应用 Acegi 保护 Java 应用程序: 续三
回页首

了解 Spring 的 IOC 框架如何从 XML 配置文件读取 Java 类信息以及如何进行实例化,这一点非常重要。您可能还记得,我在系列文章的 第 1 部分 中使用一个 web.xml 文件配置 <listener> 标记,它指向名为 ContextLoaderListener 的类。ContextLoaderListener 装载 Spring 的 IOC 框架并创建 Java 对象。您可以参考 第 1 部分的清单 8 查看全部内容。图 1 也对此进行了描述:

?

应用 Acegi 保护 Java 应用程序: 续三

?

?

现在我们将详细讨论这些步骤:

    当初始化 Acegi 应用程序时,servlet 容器(本例中为 Apache Tomcat)创建了一个 servlet 上下文,其中保存了有关应用程序资源的信息,例如 JSP 页面和类。

    servlet 容器通知 ContextLoaderListener 类应用程序正在启动。

    ContextLoaderListener 类创建一个 Web 应用程序上下文以保存应用程序中特定于 Spring 的资源信息。借助 Spring 的 IOC 框架,您可以装载自己的自定义应用程序上下文。要创建应用程序上下文,将使用名为 ContextLoader 的上下文装载器类装载应用程序上下文。

    如果应用程序不需要定义自己的应用程序上下文,则可以使用名为 XMLWebApplicationContext 的类,它是 Spring 框架的一部分并提供可处理 Spring XML 配置文件的功能。Acegi 应用程序使用的是 Spring 的 XML 配置文件,因此本文仅讨论由 XMLWebApplicationContext 类表示的应用程序上下文。在本例中,上下文装载器对 XMLWebApplicationContext 类进行实例化,后者表示您的 Acegi 应用程序的应用程序上下文。上下文装载器还在 Web 应用程序上下文中设置 servlet 上下文(于步骤 1 中创建)的引用。

    XMLWebApplicationContext 类对 XML 配置文件进行解析,获得关于 Java 类的信息并将信息装载到其他内部对象中。

    XMLWebApplicationContext 类对 XML 配置文件中指定的所有 Java 类进行实例化。XMLWebApplicationContext 类检查 XML 配置文件中经过配置的 Java bean 是否依赖其他的 Java 对象。如果是的话,XMLWebApplicationContext 类将首先对其他 bean 所依赖的 bean 进行实例化。通过这种方式,XMLWebApplicationContext 类创建了 XML 配置文件中定义的所有 bean 的实例。(注意,步骤 6 假定 XML 配置文件中所有 bean 都不要进行保护,稍后一节将介绍步骤 5 和步骤 6 之间执行的额外步骤,从而保护对此处创建的 Java bean 的访问)。

    XMLWebApplicationContext 类将所有 bean 保存在一个数组中。

您现在已了解到如何从 XML 配置文件中装载 bean 定义并创建 Java 类的实例。接下来,我将向您介绍 Spring bean 代理并解释它对于保护 Java 类实例的重要性。

?

?

?


应用 Acegi 保护 Java 应用程序: 续三
应用 Acegi 保护 Java 应用程序: 续三
回页首


应用 Acegi 保护 Java 应用程序: 续三
应用 Acegi 保护 Java 应用程序: 续三
回页首


应用 Acegi 保护 Java 应用程序: 续三
应用 Acegi 保护 Java 应用程序: 续三
回页首

当单击应用程序的 Catalog 链接时,它将要求您进行登录。如果以 alice 或 specialUser 的身份进行登录,示例应用程序将提供完整的 类别,包括公有数据和私有数据。这是因为在 清单 5 中,您对方法安全性拦截器进行了配置,允许用户使用 ROLE_HEAD_OF_ENGINEERING 访问私有类别,而 alice 和 specialUser 都具有该访问权。另一方面,如果您以 bob 的身份登录,示例应用程序将仅显示公有数据。


应用 Acegi 保护 Java 应用程序: 续三
应用 Acegi 保护 Java 应用程序: 续三
应用 Acegi 保护 Java 应用程序: 续三
回页首

<property name="key"> <value>myKeyPass</value> </property> </bean> </property> <property name="objectDefinitionSource"> <value> sample.PrivateCatalog.getData=ROLE_HEAD_OF_ENGINEERING,RUN_AS_MANAGER </value> </property></bean>

清单 6 使用粗体显示了两处增强(与 清单 5 相比)。第一处增强为 runAsManager 属性。runAsManager 属性的作用是向通过身份验证的用户动态添加角色。出于这个目的,runAsManager 属性包含了 RunAsManagerImpl bean 的定义。RunAsManagerImpl bean 只有在满足下面的条件时才可变为活跃状态:在 objectDefinitionSource 方法的角色定义中找到以 RUN_AS_ 为前缀的角色。例如,PrivateCatalog.getData() 方法的角色定义(清单 6 中以粗体显示的第二处增强)具有一个 RUN_AS_MANAGER 角色。

?

RunAsManagerImpl bean 包含一个名为 key 的属性,它封装的加密键用于确保只将额外的角色作为 run-as-replacement 程序的一部分生成。

?

当用户调用 getData() 方法时,RunAsManagerImpl bean 变为活跃状态并创建名为 RUN_AS_MANAGER 的额外角色,从而启用 getData() 方法访问远程应用程序。

?

增强的方法安全性

?

本文的 下载源代码 包含一个名为 EnhancedAcegiMethodSecurity 的示例应用程序,它可以演示 run-as-replacement 机制和程序。该应用程序将显示一个具有 Catalog 链接的索引页面。如果单击 Catalog 链接,将要求进行登录。

?

登录后,EnhancedAcegiMethodSecurity 应用程序将为您提供登录用户及其角色的完整信息。例如,如果以 alice 或 specialUser 身份登录,将向您显示用户的所有业务角色,包括额外创建的临时的 RUN_AS_MANAGER 角色。

?

结束语

在这份共分三部分的系列文章中,我介绍了如何使用 Acegi 安全系统增强基于 URL 的安全性和基于方法的安全性。您了解了如何设计访问控制策略并将它们托管在目录服务器中,如何对 Acegi 进行配置以与目录服务器进行通信,以及如何根据托管在服务器的访问控制策略制定身份验证和授权决策。

?

本系列的最后一篇文章主要介绍使用基于方法的安全性保护 Java 类实例。文章还解释了 Acegi 和 Spring 如何在内部创建和代理 Java 对象以及 bean 代理如何实现访问控制。文章包含了两个示例应用程序,您可以使用它们进一步研究本系列中学到的概念,更多有关使用 Acegi 保护 Java 应用程序的内容,请参见 参考资料 小节。

?

?

?

实例程序见附件。

?

?

?

全文完!

?

?

1 楼 xzy_love 2008-01-10 是从ibm网站上面弄来的

读书人网 >软件架构设计

热点推荐