|
在当今的数字世界中,为异构应用程序平台用户提供适当的验证和授权机制是一个普遍的挑战。通过根据标准集成面向服务架构(SOA),我们可以在服务和应用程序之间提供协作和通信。但是,所有软件都需要应用程序级安全,因此只有预先授权的用户可以访问应用程序。通过在企业内部实现集中化的身份和访问管理,我们可以控制用户在何时可以访问哪些资源。
本系列文章的第 1 部分 演示了如何使用 Sun Java System Access Manager(以后称为 Access Manager)为虚构的医疗保险公司 EB Health 提供用户授权机制。在第 2 部分中,您将继续在 EB Health 的例子中使用 Access Manager,学习如何满足一些最常见但较为复杂的企业部署和质量要求。
本部分假设读者:
- 充分理解第 1 部分
- 具有安装、配置和部署 Access Manager 的经验
- 具备 Web 服务和针对 Web 服务的 Java XML API ( JAX-WS )的工作经验。
目录
需求
EB Health 现在如愿以偿,拥有了用 Java 或 .NET 编程语言编写的许多多平台应用程序,而且必须构建单点登录( Single Sign-On,SSO) 策略来适应 EB Health 平台的支持。下面是给出的需求:
- 使用 Access Manager 构建既适用于 Java 应用程序又适用于非 Java 的应用程序的 SSO 架构。
- 增强精细模型以便获得更快性能 在页面上带有多个安全部件的应用程序要求对 Access Manager 进行多重调用来评估策略;但却降低了系统性能。
- 在细粒度授权模型中,扩展基于角色的访问控制 ( Role-Based Access Control, RBAC )授权使系统支持非 Java 应用程序。
阅读 EB Health 解决方案的详细内容和支持所需功能的设计。解决方案构建在第 1 部分中所描述的概念之上。
架构
整个架构与第 1 部分相同。由于有了 Access Manager Policy Agent,您可以通过在 Microsoft Internet Information Services (IIS) Web 服务器上安装 Policy Agent,保护与 .NET 类似平台上的应用程序。此后,IIS 代理获得 SSO 的方式是,在集中化的 Access Manager 实例中验证用户,并允许用户访问受保护的应用程序。大多数符合行业标准的 Web 和 Java EE 容器中都支持 Access Manager Policy Agent。
图 1 显示了更新的 Java 和非 Java 应用程序平台的架构。
图 1:架构
|
您可以以下面两种模式中的任意一种来配置 IIS 和 Apache Web 服务器的 Policy Agent:
URL_POLICY 模式,在该模式下,Policy Agent 截取所有传入的 HTTP 或 HTTPS 请求,并对其进行验证、检查会话有效性和授权。
SSO_ONLY 模式,在该模式下,Policy Agent 截取所有传入的 HTTP 或 HTTPS 请求,并只对其进行验证、检查会话有效性。
结果,在多个平台之间成功现实 SSO ,在用户正在执行的容器中传递信息。
一旦用户经过验证并授权访问当前 ULR,用 JavaServer Page 或 Active Server Page 技术创建的应用程序组件就能提取 SSO 会话标记,从而进一步调用 Access Manager 和执行附加的授权调用。详细阅读第 1 部分。
通过资源层次对批量策略进行评估
本部分详尽描述如何满足应用程序的性能需求,该应用程序在单页面上使用多个字段保护页面。在第 1 部分中讨论的细粒度授权的开发是通过评估页面资源策略的 Access Manager SDK 实现的。当多个对象要求授权时,由 SDK 生成对 Access Manager 的多重调用。
为了缓解用于保护许多资源的应用程序所涉及的性能,RB Health 使用少量 Access Manager 服务器端 API ,构建基于层次的资源模型来表示应用程序资源。图 2 演示了资源层次的设计
图 2:资源层次
|
在此,我们不是对单个资源进行定义,而是用字符串通过使用斜线分隔资源层次来定义父文件和子文件。例如:
ClaimsApp/UserForm/SSN_FORM_FIELD ClaimsApp/UserForm/UID_FIELD ClaimsApp/UserForm/PHONE_NUM_FIELD
|
ClaimsApp 是一个应用程序名称;UserForm 是页面名称;SSN_FORM_FIELD、 UD_FIELD 和 PHONE_NUM_FIELD 是页面上的字段名称。
下面给出另外一个例子:
MacMail/NewMessageWindow/AddressButton
|
为了定义资源,EB Health 将遵循第 1 部分中描述的过程(参见图 3),但是坚持新的名称约定,也就是,用斜线指示资源层次。
图 3:定义资源
|
现在,资源模型请求在服务器端上的服务,服务器端的 EB Health 部署 Access Manager 调用 API 来评估策略。其结果是:EB Health 必须为父文件资源调用服务,并为父文件及其资源获取授权级别。EB Health 采用 Transfer Object 方式通过在网络间发送单个调用而不是多个调用来提高性能。
现在 JAX-WS 将发挥作用。服务通过向客户机公开的单个 Web 服务端点封装 Access Manager API 调用,从而突出 JAX-WS 服务本身。
互操作授权服务
授权服务的设计完成 EB Health 的最新请求:通过创建互操作 Web 服务建立对非 Java 客户机的细粒度授权。
Web 服务端点可以作为一种互操作服务。EB Health 通过来自 Java 和 .NET 应用程序的 HTTPS 使用简单对象访问协议(Simple Object Access Protocol,SOAP)调用互操作服务。参见架构图 4
图 4:Web 服务端点的架构
|
在客户端,Java 和 .NET 应用程序都被 Access Manager Policy Agent 保护从而获得安全访问并确保 SSO 调用的有效性。该过程翻译为在应用程序平台之间在 URL 级别和 SSO 架构上的策略改进。客户机通过 Web 服务 API 调用 Web 服务获得细粒度授权。
EB Health 以 JAX-WS Web 服务端点(在 Access Manager 相同的容器中运行)形式实施授权服务,以便获得服务器端 Access Manager API 的使用。Web 服务评估策略并将决策 — 访问级别 — 返回给请求方(应用程序)。
考虑一下这个例子 —— Web 服务的签名方法:
public AccessLevelResultSet authorize(String ssoTokenStr, String serviceName, String resource)
|
该方法涉及三个参数:
使用 NetBeans IDE 开发、部署和测试服务端点
EB Health 在 NetBeans IDE 中开发 Web 服务。NetBeans IDE 中包含为构建 Java 应用程序和 Web 服务类似的直观界面。配置选项卡可用于插入 Web 容器,从而快速部署服务端点。
配置和部署
EB Health 使用 Access Manager 在 GlassFish Application Server 容器内配置、部署、和执行服务。图 5 显示 NetBeans IDE 的主窗口。
图 5:NetBeans IDE (单击 image for larger view 选项。)
|
代码片断显示评估策略的服务器端组件:
/** * Web service operation */ @WebMethod public AccessLevelResultSet authorize(@WebParam(name = "ssoTokenStr")String ssoTokenStr, @WebParam(name = "serviceName") String serviceName, @WebParam(name = "resource") String resource) { AccessLevelResultSet results = null;
try { // Use the SSOTokenManager to get an instance of the SSOToken object from // the string passed from the client.
SSOTokenManager tokenMgr = SSOTokenManager.getInstance(); SSOToken ssoToken = tokenMgr.createSSOToken(ssoTokenStr);
PolicyEvaluator polEval = new PolicyEvaluator(serviceName); Set resourceResults = polEval.getResourceResults(ssoToken,resource,ResourceResult.SUBTREE_SCOPE,new HashMap()); results = new AccessLevelResultSet(resourceResults); } catch (SSOException ssoe) { } catch (NameNotFoundException nnfe) { } catch (PolicyException pe) { } return results; }
|
字符串解释:
PolicyEvaluator,服务器端版本的计算器,根据相应资源启用策略评估。
ResourceResult 指定在何种级别范围基础上做出策略决策。
ResourceResult.SUBTREE_SCOPE 仅为资源或资源及其子资源获取策略决策。
AccessLevelResultSet,是一个可序列化的类,用原始对象表示 Access Manager 策略计算器资源的访问级别值。为确保 Java 和 .NET 平台的互操作性,EB Health 使用简单的数据类型为类编写代码。
测试
为了测试 Web 服务,EB Health 首先在 NetBeans IDE 中生成客户机,然后在 Web 应用程序中使用 Business Delegate 作为客户机代码,以便封装正在调用 JAX-WS 的相关复杂问题。也就是,EB Health 使用 Web 服务端点在应用程序中集成代码来执行授权调用。
要在 IDE 中生成客户机存根,选择 New > Web Service Client 选项。然后显示指定 Web 服务端点位置的窗口。参见图 6。
图 6:在 NetBeans IDE 中生成客户机
|
使用 Web 服务描述语言(Web Services Description Language,WSDL ),NetBeans IDE 在 Web 服务上获取信息,然后生成正确的客户机工件。
Java 客户机片断在应用程序内调用 Web 服务:
public AccessLevelResultSet authorize(String resource) { AccessLevelResultSet results = null try { EBHealthAuthZWSService service = new com.ebhealth.claims.EBHealthAuthZWSService(); EBHealthAuthZWS port = service.getEBHealthAuthZWSPort();
results = port.authorize(ssoTokenStr, serviceName, resource); } catch (Exception ex) {}
return results; }
|
假设应用程序受 Policy Agent 保护,authorize 调用请求 SSO 令牌字符串(应用程序能从 HttpServletRequest 或 cookie 中提取该字符串)。策略服务是为应用程序托管规则的自定义服务( CustomClaimsAppPolicyService )。资源要么是指示应用程序、模型、或页面的惟一字符串;要么是在页面上的一个部件。
下列代码片断是调用 Web 服务的同等 C# :
public AccessLevelResultSet authorize(String resource) { AccessLevelResultSet result = null;
try { EBHealthAuthZWS authZWS = new AuthZWS();
authorizeRequest request = new authorize(); authorizeRequest.String_1 = ssoTokenStr; authorizeRequest.String_2 = serviceName; authorizeRequest.String_3 = resource;
authorizeResponse response = authZWS.authorize(myPermissionRequest); result = Converter.toAccessLevelResultSet(response.result); } catch (SecurityServiceException sse) {} return(result); }
|
关于 Web 服务和 .NET 框架的详细信息,请参阅下面的“参考资料”部分。要在 Web 服务中学习签名方法,请参阅 Sun Java System Access Manager 7.1 API。
结束语
EB Health 的例子向您演示了如何扩展 Access Manager 来满足企业对访问管理的一些常见需求。Policy Agent 架构通过提供验证、授权和 SSO 功能适应多个符合行业标准的应用程序服务器。此外,由于使用 API 和可配置服务层,要获得 Java 和非 Java 应用程序的细粒度授权,Access Manager是理想选择。
致谢
非常感谢 Sun 公司的 Bartosz Adamczyk、Dilli Dorai、Ramesh Nagappan 和 Pat Patterson 所给与的即时评论和优秀注释。
参考资料
- Sun Java System Access Manager
- 技术和 IDE
- 相关的开源项目
- 相关文章 使用身份服务保护应用程序
- Sun 开发人员服务
|