如何从服务器外部的 Java 客户端 运行 访问 WebSphere 身份验证别名信息?
How can I access WebSphere authentication alias info from a Java client running outside of the server?
我使用以下代码 (see this SO post) 读取在我的 WAS 7 服务器上存储为 JC2 别名的用户 ID 和密码。
Map<String, String> map = new HashMap<String, String>();
map.put(Constants.MAPPING_ALIAS, MDM_JC2_ALIAS);
CallbackHandler callbackHandler = WSMappingCallbackHandlerFactory.getInstance().getCallbackHandler(map, null);
LoginContext loginContext = new LoginContext(DEFAULT_PRINCIPAL_MAPPING, callbackHandler);
loginContext.login();
Subject subject = loginContext.getSubject();
Set<Object> credentials = subject.getPrivateCredentials();
PasswordCredential passwordCredential = (PasswordCredential) credentials.iterator().next();
userId = passwordCredential.getUserName();
password = new String(passwordCredential.getPassword());
代码运行良好。但现在我正试图在批处理过程中使用它。要测试批处理过程,我必须使用 运行->Debug As in Rad 8.5。 (我使用 运行->Debug As->Debug configurations 配置过程)。我收到错误 "java.lang.NullPointerException: WSMappingCallbackHandlerFactory not initialized"。我已经逐步完成了有效的代码,并且看不到无效代码的值有任何差异。我怀疑我可能需要修改调试配置中的构建路径,但我不知道要更改什么。
编辑:
我认为我没有很好地解释情况。该代码在 WAS 7 上的 Web 服务 运行 内部工作。我们有完全不同的项目,其中有一些代码被称为批处理作业,如下所示:
-classpath D:\WebSphere\AppServer\profiles\AppSrv01\Apps\Cell01\SSS.ear\PlanningEJB.jar;
D:\WebSphere\AppServer\profiles\AppSrv01\Apps\Cell01\SSS.ear\Planning.war\WEB-INF\classes;
D:\Progra~1\IBM\SQLLIB\java\db2jcc.jar -Dlog4j.configuration=file:/d:/apps/websphere/SSS/properties/log4J.properties
url.planning.batch.AppName D:\apps\websphere\SSS\properties\sss.properties
我想将读取用户 ID 和密码的代码添加到作为批处理作业调用的代码中。通常调试被称为批处理作业的代码,我们使用调试配置,服务器不必是 运行。我可以设置断点并单步执行代码,直到我到达 callbackHandler
行。
如何编写Java客户端(运行在服务器外)查看WebSphere认证别名信息
您不能在服务器外 运行 客户端使用与在服务器内 运行 客户端相同的 API。
要在 Java 中执行此操作(与 wsadmin/Jython 不同,后者是另一种方法),您可以从以下代码开始:
示例Java代码
package mypkg;
import java.util.Properties;
import javax.management.ObjectName;
import com.ibm.websphere.management.AdminClient;
import com.ibm.websphere.management.AdminClientFactory;
import com.ibm.websphere.management.Session;
import com.ibm.websphere.management.configservice.ConfigServiceHelper;
import com.ibm.websphere.management.configservice.ConfigServiceProxy;
public class MyAdminClient {
public static void main(String[] args) throws Exception {
String aliasToFind = "blahAlias"; // Or "MyNode/blahAlias" if you use the node prefix.
String SOAP_CONNECTOR_ADDRESS_PORT = "8879";
String host = "localhost";
// Initialize the AdminClient
Properties adminProps = new Properties();
adminProps.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP);
adminProps.setProperty(AdminClient.CONNECTOR_HOST, host);
adminProps.setProperty(AdminClient.CONNECTOR_PORT, SOAP_CONNECTOR_ADDRESS_PORT);
AdminClient adminClient = AdminClientFactory.createAdminClient(adminProps);
// Get the ConfigService implementation
ConfigServiceProxy configService = new ConfigServiceProxy(adminClient);
Session session = new Session();
// Find the parent security object
ObjectName security = ConfigServiceHelper.createObjectName(null, "Security", null);
ObjectName[] securityName = configService.queryConfigObjects(session, null, security, null);
security = securityName[0];
ObjectName authData = ConfigServiceHelper.createObjectName(null, "JAASAuthData", null);
ObjectName[] authDataEntries = configService.queryConfigObjects(session, null, authData, null);
ObjectName auth;
for (int i=0; i < authDataEntries.length; i++) {
auth = authDataEntries[i];
Object aliasAttr = configService.getAttribute(session, auth, "alias");
if (aliasAttr.equals(aliasToFind)) {
System.out.println("Alias located: alias = " + configService.getAttribute(session, auth, "alias")
+ "; userId = " + configService.getAttribute(session, auth, "userId")
+ "; password = " + configService.getAttribute(session, auth, "password"));
break;
}
}
}
}
用'Administration Thin Client'来compile/run对抗
在最简单的情况下(没有安全性,这可能对入门很有用),您只需将 Administration Thin Client 添加到 Eclipse 项目的 Properties ->Java 构建路径。
在 WebSphere V9 中,这将是文件 WAS_INSTALL_ROOT/runtimes/com.ibm.ws.admin.client_9.0.jar
,其他版本也类似。
要 运行 启用安全性,您可能需要设置其他系统属性,并且可能需要根据 JDK 进行其他设置。看这里](
https://www.ibm.com/support/knowledgecenter/SSAW57_9.0.0/com.ibm.websphere.nd.multiplatform.doc/ae/txml_adminclient.html) 了解更多信息。
参考/学分
我使用以下代码 (see this SO post) 读取在我的 WAS 7 服务器上存储为 JC2 别名的用户 ID 和密码。
Map<String, String> map = new HashMap<String, String>();
map.put(Constants.MAPPING_ALIAS, MDM_JC2_ALIAS);
CallbackHandler callbackHandler = WSMappingCallbackHandlerFactory.getInstance().getCallbackHandler(map, null);
LoginContext loginContext = new LoginContext(DEFAULT_PRINCIPAL_MAPPING, callbackHandler);
loginContext.login();
Subject subject = loginContext.getSubject();
Set<Object> credentials = subject.getPrivateCredentials();
PasswordCredential passwordCredential = (PasswordCredential) credentials.iterator().next();
userId = passwordCredential.getUserName();
password = new String(passwordCredential.getPassword());
代码运行良好。但现在我正试图在批处理过程中使用它。要测试批处理过程,我必须使用 运行->Debug As in Rad 8.5。 (我使用 运行->Debug As->Debug configurations 配置过程)。我收到错误 "java.lang.NullPointerException: WSMappingCallbackHandlerFactory not initialized"。我已经逐步完成了有效的代码,并且看不到无效代码的值有任何差异。我怀疑我可能需要修改调试配置中的构建路径,但我不知道要更改什么。
编辑:
我认为我没有很好地解释情况。该代码在 WAS 7 上的 Web 服务 运行 内部工作。我们有完全不同的项目,其中有一些代码被称为批处理作业,如下所示:
-classpath D:\WebSphere\AppServer\profiles\AppSrv01\Apps\Cell01\SSS.ear\PlanningEJB.jar;
D:\WebSphere\AppServer\profiles\AppSrv01\Apps\Cell01\SSS.ear\Planning.war\WEB-INF\classes;
D:\Progra~1\IBM\SQLLIB\java\db2jcc.jar -Dlog4j.configuration=file:/d:/apps/websphere/SSS/properties/log4J.properties
url.planning.batch.AppName D:\apps\websphere\SSS\properties\sss.properties
我想将读取用户 ID 和密码的代码添加到作为批处理作业调用的代码中。通常调试被称为批处理作业的代码,我们使用调试配置,服务器不必是 运行。我可以设置断点并单步执行代码,直到我到达 callbackHandler
行。
如何编写Java客户端(运行在服务器外)查看WebSphere认证别名信息
您不能在服务器外 运行 客户端使用与在服务器内 运行 客户端相同的 API。
要在 Java 中执行此操作(与 wsadmin/Jython 不同,后者是另一种方法),您可以从以下代码开始:
示例Java代码
package mypkg;
import java.util.Properties;
import javax.management.ObjectName;
import com.ibm.websphere.management.AdminClient;
import com.ibm.websphere.management.AdminClientFactory;
import com.ibm.websphere.management.Session;
import com.ibm.websphere.management.configservice.ConfigServiceHelper;
import com.ibm.websphere.management.configservice.ConfigServiceProxy;
public class MyAdminClient {
public static void main(String[] args) throws Exception {
String aliasToFind = "blahAlias"; // Or "MyNode/blahAlias" if you use the node prefix.
String SOAP_CONNECTOR_ADDRESS_PORT = "8879";
String host = "localhost";
// Initialize the AdminClient
Properties adminProps = new Properties();
adminProps.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP);
adminProps.setProperty(AdminClient.CONNECTOR_HOST, host);
adminProps.setProperty(AdminClient.CONNECTOR_PORT, SOAP_CONNECTOR_ADDRESS_PORT);
AdminClient adminClient = AdminClientFactory.createAdminClient(adminProps);
// Get the ConfigService implementation
ConfigServiceProxy configService = new ConfigServiceProxy(adminClient);
Session session = new Session();
// Find the parent security object
ObjectName security = ConfigServiceHelper.createObjectName(null, "Security", null);
ObjectName[] securityName = configService.queryConfigObjects(session, null, security, null);
security = securityName[0];
ObjectName authData = ConfigServiceHelper.createObjectName(null, "JAASAuthData", null);
ObjectName[] authDataEntries = configService.queryConfigObjects(session, null, authData, null);
ObjectName auth;
for (int i=0; i < authDataEntries.length; i++) {
auth = authDataEntries[i];
Object aliasAttr = configService.getAttribute(session, auth, "alias");
if (aliasAttr.equals(aliasToFind)) {
System.out.println("Alias located: alias = " + configService.getAttribute(session, auth, "alias")
+ "; userId = " + configService.getAttribute(session, auth, "userId")
+ "; password = " + configService.getAttribute(session, auth, "password"));
break;
}
}
}
}
用'Administration Thin Client'来compile/run对抗
在最简单的情况下(没有安全性,这可能对入门很有用),您只需将 Administration Thin Client 添加到 Eclipse 项目的 Properties ->Java 构建路径。
在 WebSphere V9 中,这将是文件 WAS_INSTALL_ROOT/runtimes/com.ibm.ws.admin.client_9.0.jar
,其他版本也类似。
要 运行 启用安全性,您可能需要设置其他系统属性,并且可能需要根据 JDK 进行其他设置。看这里]( https://www.ibm.com/support/knowledgecenter/SSAW57_9.0.0/com.ibm.websphere.nd.multiplatform.doc/ae/txml_adminclient.html) 了解更多信息。