传播定制 Java 可序列化对象以进行安全性属性传播
本文档描述如何从登录模块将对象添加到主体集中,还描述确保 Java™ 对象得以传播的其他基础结构注意事项。
开始之前
关于此任务
过程
- 从定制登录模块将定制 Java 对象添加到主体集中。 每个 Java 认证和授权服务 (JAAS) 登录模块都有个两阶段过程。WebSphere® Application Server 为配置中存在的每个登录模块完成以下过程:
- 登录方法
- 在此步骤中,将分析登录配置回调(必要的话)并创建新的对象或凭证。
- 落实方法
- 在此步骤中,登录期间创建的对象或凭证被添加到主体集。
将某个定制 Java 对象添加到主体集后,WebSphere Application Server 在发送服务器上序列化该对象,在接收服务器上反序列化该对象,然后将该对象添加回下游主体集中。但是,需要一些条件才能使此过程成功发生。有关 JAAS 编程模型的更多信息,请参阅“安全性:学习资源”一文中提供的 JAAS 信息。要点: 无论何时将定制登录模块插入到 WebSphere Application Server 的登录基础结构时,请确保代码是可信的。如果将这些类一起放入 Java 归档 (JAR) 文件中,并将该文件添加到 app_server_root/lib/ext/ 目录,那么登录模块具有 Java 2 安全性 AllPermissions 许可权。建议将登录模块和其他基础结构类添加到任何专用目录中。然而,必须修改 profile_root/properties/server.policy 文件以确保您的专用目录和/或 Java 归档 (JAR) 文件有所需的许可权以运行从登录模块调用的应用程序编程接口 (API)。因为登录模块可以在调用堆栈上的应用程序代码后运行,所以可以添加 doPrivileged 代码,这样就不需要将其他属性添加到应用程序。
要点: 无论何时将定制登录模块插入到 WebSphere Application Server 的登录基础结构时,请确保代码是可信的。将登录模块添加到 profile_root/classes 目录时,该登录模块有 Java 2 安全性 AllPermissions 许可权。有关更多信息,请参阅在概要文件中为定制类创建 classes 子目录。但是,因为登录模块可以在调用堆栈上的应用程序代码后运行,所以可以添加 doPrivileged 代码,这样就不需要将其他属性添加到应用程序。
以下代码样本说明如何添加 doPrivileged 代码。有关在初始化、登录和落实期间的操作的信息,请参阅针对 JAAS 开发用于系统登录配置的定制登录模块。public customLoginModule() { public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { } public boolean login() throws LoginException { // Construct callback for the WSTokenHolderCallback so that you // can determine if // your custom object has propagated Callback callbacks[] = new Callback[1]; callbacks[0] = new WSTokenHolderCallback("Authz Token List: "); try { _callbackHandler.handle(callbacks); } catch (Exception e) { throw new LoginException (e.getLocalizedMessage()); } // Checks to see if any information is propagated into this login List authzTokenList = ((WSTokenHolderCallback) callbacks[1]). getTokenHolderList(); if (authzTokenList != null) { for (int i = 0; i< authzTokenList.size(); i++) { TokenHolder tokenHolder = (TokenHolder)authzTokenList.get(i); // Look for your custom object. Make sure you use // "startsWith"because there is some data appended // to the end of the name indicating in which Subject // Set it belongs. Example from getName(): // "com.acme.CustomObject (1)". The class name is // generated at the sending side by calling the // object.getClass().getName() method. If this object // is deserialized by WebSphere Application Server, // then return it and you do not need to add it here. // Otherwise, you can add it below. // Note: If your class appears in this list and does // not use custom serialization (for example, an // implementation of the Token interface described in // the Propagation Token Framework), then WebSphere // Application Server automatically deserializes the // Java object for you. You might just return here if // it is found in the list. if (tokenHolder.getName().startsWith("com.acme.CustomObject")) return true; } } // If you get to this point, then your custom object has not propagated myCustomObject = new com.acme.CustomObject(); myCustomObject.put("mykey", "mydata"); } public boolean commit() throws LoginException { try { // Assigns a reference to a final variable so it can be used in // the doPrivileged block final com.acme.CustomObject myCustomObjectFinal = myCustomObject; // Prevents your applications from needing a JAAS getPrivateCredential // permission. java.security.AccessController.doPrivileged(new java.security. PrivilegedExceptionAction() { public Object run() throws java.lang.Exception { // Try not to add a null object to the Subject or an object // that already exists. if (myCustomObjectFinal != null && !subject.getPrivateCredentials(). contains(myCustomObjectFinal)) { // This call requires a special Java 2 Security permission, // see the JAAS application programming interface (API) // documentation. subject.getPrivateCredentials().add(myCustomObjectFinal); } return null; } }); } catch (java.security.PrivilegedActionException e) { // Wraps the exception in a WSLoginFailedException java.lang.Throwable myException = e.getException(); throw new WSLoginFailedException (myException.getMessage(), myException); } } // Defines your login module variables com.acme.CustomObject myCustomObject = null; }
- 验证您的定制 Java 类是否实现 java.io.Serializable 接口。 如果要传播添加到主体集的对象,那么该对象必须被序列化。例如,该对象必须实现 java.io.Serializable 接口。如果该对象未被序列化,请求不失败,而且该对象不传播。要确保添加到主体集的对象已传播,请实现安全性属性传播中定义的某个令牌接口或将属性添加到以下某个存在的缺省令牌实现:
- AuthorizationToken
- 如果属性是特定于用户的,请添加。有关更多信息,请参阅使用缺省授权令牌来传播安全性属性。
- PropagationToken
- 添加特定于调用的属性。有关更多信息,请参阅使用缺省传播令牌来传播安全性属性。
如果您仔细添加定制对象并按所有步骤操作以确保 WebSphere Application Server 可以在每个中继段序列化和反序列化对象,那么只使用定制 Java 对象就足够了。
- 验证您的定制 Java 类是否存在于可能接收请求的所有系统上。
将定制对象添加到主体集且希望 WebSphere Application Server 传播该对象时,请将类定义一起放入 Java 归档 (JAR) 文件中,并将该文件添加到所有可能执行序列化或反序列化的节点上的 app_server_root/lib/ext/ 目录。另外,请验证这些 Java 类版本是否相同。
将定制对象添加到主体集且希望 WebSphere Application Server 传播该对象时,请确保该定制对象的类定义位于所有可能执行序列化和反序列化的节点上的 profile_root/classes 目录中。另外,请验证这些 Java 类版本是否相同。
- 验证是否在环境(您需要在登录期间将定制对象添加到该环境中)中使用的所有登录配置中配置了定制登录模块。 与 WebSphere Application Server 交互作用的任何登录配置成 Enterprise JavaBeans (EJB) 请求生成可能传播出站的主体集。如果希望 WebSphere Application Server 在所有情况下都传播定制对象,请确保将定制登录模块添加到环境中使用的每个登录配置。有关更多信息,请参阅针对 JAAS 开发用于系统登录配置的定制登录模块。
- 验证是否在接收已传播信息的所有下游服务器上启用了安全性属性传播。 当 EJB 请求发送到下游服务器且在该服务器上禁用了安全性属性传播时,只为向后兼容性发送认证令牌。因此,必须复审配置以验证是否在可能接收请求的所有单元中启用了传播。您必须检查管理控制台中的多个位置以确保完全启用了传播。有关更多信息,请参阅在应用程序服务器之间传播安全性属性。
- 将任何定制对象添加到您不希望传播的传播排除列表中。 可以配置属性以排除匹配特定类名和/或软件包名称的对象的传播。例如,可以有与特定进程有关的定制对象。如果该对象已传播,那么它不包含有效信息。必须通知 WebSphere Application Server 不要传播此对象。使用管理控制台完成以下步骤以指定传播排除列表中的对象:
- 单击安全性 > 全局安全性 > 定制属性 > 新建。
- 在名称字段中添加 com.ibm.ws.security.propagationExcludeList。
- 在值字段中添加定制对象的名称。 可以将一组定制对象添加到传播排除列表,用冒号分隔多个定制对象。例如,可以输入
com.acme.CustomLocalObject:com.acme.private.*。可以输入诸如 com.acme.CustomLocalObject 的类名或诸如 com.acme.private.* 的包名称。在本示例中,WebSphere Application Server 不传播等于 com.acme.CustomLocalObject 或以 com.acme.private 开头的任何类。
虽然可以将定制对象添加到传播排除列表,但是必须知道其副作用。在单点登录 (SSO) 令牌的生存期,WebSphere Application Server 将不透明令牌或序列化的主体集内容存储在本地高速缓存中。缺省值为两小时的 SSO 令牌的生存期在管理控制台的 SSO 属性中配置。添加到不透明令牌的信息仅包括不在排除列表中的对象。
确保 SSO 令牌超时值大于认证高速缓存超时值。要修改认证高速缓存,请参阅有关认证高速缓存设置的文档。
结果
相关概念:


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_propcustjavaser
文件名:tsec_propcustjavaser.html