Java Solaris 加入 SDN 参与讨论 我的社区 注册说明
 
 
 
 
 
 
Java API 文档中文版
使用 J2EE Policy Agent 保护应用程序,第 1 部分:基本步骤
 
By Sean Brydon 和 Aravindan Ranganathan, 12/11/08  

OpenSSO

OpenSSO 是一个由 Sun 发起的开源项目,专为 Web 应用程序、单点登录(single sign-on,SSO)、联合、身份认证服务提供包括安全性在内的核心身份功能。该项目是在 Sun Java System Access Manager 的基础上开发的,构成了 Sun OpenSSO Enterprise 8 这一商业发行版的基础。与基于社区的 OpenSSO 子项目一样,它与 SAML 2.0、XACML 和 WS-Federation 等侧重于企业的标准共同为 OpenID 和 Information Cards 等协议提供支持。

OpenSSO 服务器(简称为 OpenSSO )为验证、用户会话管理、策略管理、审计和日志记录等功能提供身份存储库和许多服务,它通常采用集中化的管理方式。结合 J2EE Policy Agent,您可以通过 OpenSSO 的安全服务来保护 Web 应用程序,限制未经验证的访问。OpenSSO 还提供了一些其他保护选项,例如利用简单对象访问协议(Simple Object Access Protocol,SOAP)和代表性状态传输(REpresentational State Transfer,REST)接口的客户机 SDK 或身份认证服务。但是,这些选项需要启用安全服务的额外代码,因而更为复杂,实现起来较为费时。

通过在应用程序服务器实例(该实例上部署了应用程序)上安装 Policy Agent 并对其进行配置,您可以强制执行验证、单点登录和授权。在安装过程中,为已部署应用程序提供保护的各个类将被添加到您的应用程序服务器实例中。在此之后,您还可以启用 Web 服务安全,为用户个性化应用程序,并映射到 J2EE 安全机制上。

本文是系列文章的第 1 部分,通过一个简单的应用程序示例来向您展示如何使用 Policy Agent 和 OpenSSO 来保护 Web 应用程序。您将了解如何完成这两项任务:

  1. 创建 OpenSSO 用户帐户。
  2. 强制用户登录,并在准许访问应用程序之前对其进行身份验证。

本系列文章的第 2 部分将介绍如何仅保护应用程序的某些页面,如何允许通过验证的用户在不必再次登录的情况下访问企业中的其他应用程序——换句话说,就是如何实现 SSO。

本文假设您熟悉 OpenSSO 和 Policy Agent 的基础知识,并且已经在系统上安装了它们。要了解有关安装过程方面的内容,请参见本 教程

目录

 

概述
一个简单示例
过程
结束语
参考资料

 

概述

如果您在不同的容器上安装 OpenSSO 和 Policy Agent,那么 Policy Agent 可以截取向应用程序发出的请求并进行安全检查。当用户试图访问应用程序中受保护的资源或者页面时,屏幕就会显示 OpenSSO 登录页面。通过验证后,用户才能够访问要访问的内容。

图 1 说明了该架构。

 
图 1:Policy Agent 和 OpenSSO 保护 Web 应用程序访问的机制
 

 

过程如下所示:

  1. 浏览器将对受保护资源的请求发送给受 Policy Agent 保护的部署容器(例如 Web 服务器或者应用服务器)。
  2. Policy Agent 截取该请求并检查会话标记是否嵌入在 cookie 中。如果是,则 Policy Agent 验证用于 SSO 的标记。否则,Policy Agent 将用户定向到 OpenSSO 登录页面,让其使用用户名和口令等凭证进行登录,这样 Policy Agent 随后才可验证身份存储库中的数据。
  3. 如果验证成功,Policy Agent 将建立一个会话标记并进入到第 4 步。此外,Policy Agent 可能会为用户浏览器创建一个 cookie。

    如果验证失败,则 Policy Agent 将拒绝用户访问。
  4. Policy Agent 将验证请求发送给 OpenSSO 策略服务,以允许用户访问受保护资源。
  5. OpenSSO 通过策略决策做出响应。
  6. Policy Agent 截取该决策,并允许或者拒绝访问所请求的资源。

尽管在实际中存在许多交互,但 Policy Agent 可能会缓存信息,而不是每次都使用 OpenSSO 来请求交互。

一个简单示例

请参见这个 简单示例,其中包含两个 JavaServer Pages(JSP)页面。

  • 欢迎页面index.jsp) — 到 protect_me.jsp 页面的链接。
  • 受保护的页面protect_me.jsp) — 显示应用程序上下文根目录的名称。

有关 URL 和命名规则的假设和说明如下所示:

  • 您已经在 GlassFish 应用服务器上部署了 OpenSSO。

    OpenSSO 管理控制台的位置为 http://my.test.domain.com:8080/opensso。Policy Agent 和受保护的应用程序在另一个名称为 domain2 的 GlassFish 域中运行,位于http://my.test.domain.com:6948/simplesample
  • 在安装 Policy Agent 的同时,您已经创建了一个 Policy Agent 配置文件。

    示例应用服务器域中安装了 Policy Agent 并在其中部署了您的应用程序,您必须在该应用服务器域上创建一个 Policy Agent 配置文件。这个可以在 OpenSSO 管理控制台中编辑的配置文件包含用于 Policy Agent 的配置,例如 Policy Agent 的安全模式、受 Policy Agent 保护的应用服务器的 URL,以及安全设置。在本示例中,配置文件的名称为 myagentprofile;您可以随意为其命名。

过程

在本节中,请按照以下步骤来保护您的应用程序。

步骤 1:更新应用程序的 web.xml 文件
通过引用应用程序 web.xml 文件中的 Policy Agent 过滤器,您可以启用 Policy Agent 代码来截取 Web 请求并在允许应用程序处理这些请求前执行安全检查。

注意: 由于示例应用程序中所包含的 web.xml 文件 已经包含了过滤器片段,因此您不必执行这一步骤。

但是要将以下代码片段添加到其他应用程序的 web.xml 文件中:

<filter>
<filter-name>Agent</filter-name>
<filter-class> com.sun.identity.agents.filter.AmAgentFilter </filter-class>
</filter>
<filter-mapping>
<filter-name>Agent</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>

 

步骤 2:构建和部署应用程序
simplesample.war 文件可供下载之后,示例应用程序的构建就已经完成了。您只需在 domain2 这个安装了 Policy Agent 的 GlassFish 域上部署该应用程序就可以了。

您既可以在 GlassFish 管理控制台上部署这个应用程序,又可以通过在域的 autodeploy 目录中放置 simplesample.war 文件的一个副本(例如 C:\workspace\sample\db-stuff\my-gf-server\glassfish\domains\domain2\autodeploy)来部署它 。

步骤 3:创建用户帐户
接下来,创建一个用户帐户。然后,包括默认值(姓、名、成员关系等)以及用户指定的身份属性在内的相关身份属性将存储在 OpenSSO 身份存储库中。当用户登录以访问受保护的资源时,OpenSSO 将使用存储在身份存储库中的值与凭证进行比较。

首先,使用 Bob 作为用户 ID 创建一个用户帐户:

  1. amadmin 的身份登录 OpenSSO 管理控制台,地址为 http://my.test.domain.com:8080/opensso
  2. 单击 Access Control 选项卡,然后单击 Top Level Realm。单击 Subjects 选项卡。参见图 2。

     
    图 2:Top-Level Realm 下的 Subjects 屏幕
     
     
  3. 单击 User 下的 New 按钮以便进入 New User 屏幕。使用 secret 作为口令填写这些字段,如图 3 所示。单击 OK 按钮。

     
    图 3:New User 屏幕
     
     
    随后,OpenSSO 将 Bob Smith 作为帐户列出在 Users 下方。参见图 4。

     
    图 4:Bob Smith 用户帐户
     
     

技巧:要验证用户的属性是否存储在 OpenSSO 身份存储库中,单击 Subjects 选项卡,然后单击 Bob 来查看用户配置文件。或者,注销管理控制台,删除浏览器中的 cookie,使用 Bob 作为用户 ID、并用 secret 作为口令登录。

步骤 4:配置 Agent Filter 模式
您可以配置 Policy Agent 过滤器并针对不同的安全类型指定不同的模式。共有五种模式:ALLJ2EE_POLICYURL_POLICYSSO_ONLYNONE。请参见它们各自的 说明。例如,您可以向一个应用程序分配一个模式,并为没有显式模式、受保护的应用程序分配另一个模式作为默认值。

示例应用程序不依赖于任何用于提供保护的 J2EE 安全机制。相反,我们使用 OpenSSO 来保护它。请注意,该应用程序的名称及其上下文根目录默认为 mini-agentsample

执行以下操作:

  1. 在 OpenSSO 管理控制台中,导航到名称为 myagentprofile 的 J2EE Policy Agent 配置屏幕。在默认情况下,OpenSSO 显示用于该代理的 Global 屏幕,如图 5 所示。

     
    图 5:编辑 myagentprofile 屏幕
     
     
  2. 单击 Profile 部分上面的 General 链接。

    屏幕上将显示 General 子部分,其中显示了用于代理过滤器模式的配置屏幕。参见图 6。

     
    图 6:代理过滤器模式的配置屏幕
     
     
    在默认情况下,代理过滤器模式的值为 ALL,这意味着应用程序受所有过滤器模式保护。对于示例应用程序,我们指定 SSO_ONLY 模式。

    注意:该模式适用于与示例应用程序部署在相同域上的所有应用程序。或者,我们可以定义一个过滤器模式以便通过指定应用程序上下文名称以及过滤器模式(例如 [/myapp]=SSO_ONLY)来将该过滤器模式应用于某个应用程序。为简单起见,我们保留了 SSO_ONLY 模式。

    SSO_ONLY 模式有效且用户已经成功经过验证后,Policy Agent 将在浏览器中放置一个 cookie 来表示用于该用户的 OpenSSO 标记。随后,用户无需再次登录就可以访问应用程序的其他资源和其他部署过的、受 Policy Agent 保护的应用程序。
  3. 单击 Current Values 下的 ALL,然后单击 Remove 按钮。
  4. 在 Corresponding Map Value 字段中键入 SSO_ONLY,保留 Map Key 字段为空,如图 7 所示。单击 Add 按钮。

     
    图 7:SSO_ONLY 作为代理过滤器模式
     
     
    随后,OpenSSO 显示 SSO_ONLY 作为代理过滤器模式。参见图 8。

     
    图 8:SSO_ONLY 作为代理过滤器模式
     
     
  5. 重要注意事项: 单击 Edit myagentprofile 屏幕顶部的 Save 按钮。
  6. 因为模式更改不是热插拔的,所以要重新启动用于模式更改的 Policy Agent 容器以使模式更改生效。

    1. 在命令行中进入应用服务器域(本示例中为 domain2。)
    2. 关闭服务器,随后将其重新启动。例如,键入:

      glassfish\bin>asadmin stop-domain domaintest2
      glassfish\bin>asadmin start-domain domaintest2

步骤 5:为应用程序创建策略和规则
由于您已经指定了 SSO_ONLY,因此您的应用程序默认只允许通过验证的的用户访问其资源——该行为适用于本示例。在其他情况下,您可以创建更多详细斩策略,例如限制访问某些用户组或者资源。为简单起见,本示例保留 SSO_ONLY 的默认行为。

步骤 6:测试实现
最后,检查验证和 SSO 是否运行正常:

  1. 注销 OpenSSO 管理控制台并删除您浏览器中的所有 cookie,以避免两个 cookie 发生冲突(一个用于 OpenSSO,另一个用于 Policy Agent)。
  2. 在浏览器中键入 http://my.test.domain.com:6948/mini-agentsample/index.jsp 访问应用程序。

    屏幕中将显示 OpenSSO 登录页面。请注意该 URL 现在是一个 OpenSSO URL:http://my.test.domain.com:8080/opensso/UI/Login?goto=http%3A%2F%2Fmy.test.domain.com%3A6948%2Fmini-agentsample%2Findex.jsp。该 URL 中的 goto 参数指定成功登录后应返回的示例应用程序地址。
  3. 键入 Bob 作为用户名,并键入 secret 作为口令。单击 Log in 按钮。参见图 9。

     
    图 9:OpenSSO 登录页面
     
     
    浏览器将显示应用程序的欢迎页面。参见图 10。

     
    图 10:示例应用程序的欢迎页面
     
     
  4. 单击“Access the second protected page.”

    屏幕上显示受保护的页面,其中显示了应用程序上下文根目录的名称 /mini-agentsample。参见图 11。

     
    图 11:示例应用程序中的受保护页面
     
     

结束语

使用 Policy Agent,您可以轻松地为 Web 应用程序提供保护。在本文中,您学习了如何在允许用户访问页面之前强制对其进行验证,并学习了如何通过启用 SSO 来完成这一过程。

请继续关注本系列文章的第 2 部分。这部分将向您展示如何配置 OpenSSO,这样,用户可以公开访问欢迎页面等应用程序的某些资源。您还将了解如何让通过验证的用户能够访问您企业的其他应用程序而不必再次登录。

参考资料