如何从服务器外部运行的Java客户端访问WebSphere身份验证别名信息?

如何从服务器外部运行的Java客户端访问WebSphere身份验证别名信息?,java,eclipse,websphere,ibm-rad,Java,Eclipse,Websphere,Ibm Rad,我使用下面的代码读取在WAS7服务器上作为JC2别名存储的用户ID和密码 Map<String, String> map = new HashMap<String, String>(); map.put(Constants.MAPPING_ALIAS, MDM_JC2_ALIAS); CallbackHandler callbackHandler = WSMappingCallbackHandlerFactory.getInstance().get

我使用下面的代码读取在WAS7服务器上作为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());
我想将读取用户ID和密码的代码添加到称为批处理作业的代码中。通常,要调试称为批处理作业的代码,我们使用调试配置,服务器不必运行。我可以设置断点并单步执行代码,直到到达
callbackHandler
行。

如何编写Java客户端(在服务器外部运行)以查看WebSphere身份验证别名信息 在服务器外部运行的客户端不能使用与在服务器内部运行的客户端相同的API

要在Java中实现这一点(与wsadmin/Jython相反,wsadmin/Jython是一种替代方法),您可以从以下代码开始:

示例Java代码
包mypkg;
导入java.util.Properties;
导入javax.management.ObjectName;
导入com.ibm.websphere.management.AdminClient;
导入com.ibm.websphere.management.AdminClientFactory;
导入com.ibm.websphere.management.Session;
导入com.ibm.websphere.management.configservice.ConfigServiceHelper;
导入com.ibm.websphere.management.configservice.ConfigServiceProxy;
公共类MyAdminClient{
公共静态void main(字符串[]args)引发异常{
字符串aliasToFind=“blahAlias”;//或“MyNode/blahAlias”(如果使用节点前缀)。
字符串SOAP连接器地址端口=“8879”;
String host=“localhost”;
//初始化AdminClient
Properties adminProps=新属性();
setProperty(AdminClient.CONNECTOR\u类型,AdminClient.CONNECTOR\u类型\u SOAP);
adminProps.setProperty(AdminClient.CONNECTOR\u主机,主机);
adminProps.setProperty(AdminClient.CONNECTOR\u端口、SOAP\u连接器\u地址\u端口);
AdminClient AdminClient=AdminClientFactory.createAdminClient(adminProps);
//获取ConfigService实现
ConfigServiceProxy configService=新的ConfigServiceProxy(adminClient);
会话=新会话();
//查找父安全对象
ObjectName security=ConfigServiceHelper.createObjectName(null,“security”,null);
ObjectName[]securityName=configService.queryConfigObjects(会话,null,安全,null);
security=securityName[0];
ObjectName authData=ConfigServiceHelper.createObjectName(null,“JAASAuthData”,null);
ObjectName[]authDataEntries=configService.queryConfigObjects(会话,null,authData,null);
ObjectName-auth;
for(int i=0;i
使用“管理瘦客户端”编译/运行 在最简单的情况下(没有安全性,这可能对入门很有用),您可以简单地将管理瘦客户机添加到Eclipse项目的属性->Java构建路径中

在WebSphereV9中,这将是文件
WAS\u INSTALL\u ROOT/runtimes/com.ibm.ws.admin.client\u 9.0.jar
,对于其他版本也类似

要在启用安全性的情况下运行,您可能需要根据JDK设置额外的系统属性和可能的额外设置。见[此处]( )更多信息

推荐人/信用证
  • 我从解决方案开始
  • Java管理客户端的开发

当你说代码工作正常时。你的意思是说你可以用Run->Run-As让它工作,但是当你尝试调试时失败了?如果这不是你的意思,你能澄清一下当你可以让它工作时你使用的设置/环境吗?它在一个被称为web服务的web项目中运行良好。你需要在调试模式下启动服务器,然后调用该服务,如果你在那里设置了调试透视图和断点,你应该切换到调试透视图和断点。如果您试图将其作为标准java应用程序进行调试,它将无法工作。它必须从服务器上运行。要在服务器外部获取配置信息,您需要使用
com.ibm.websphere.management.*
API,如(com.ibm.websphere.management.configservice.configservice)、MBeans或wsadmin jacl/jython。正如@Gas所说,您使用的API只能在服务器上运行。您说您是在“批处理”模式下运行此API,是指您试图在服务器外运行独立的Java main()?如果是这样,您是否只需将适当的类放在类路径上,就可以假定服务器环境中可用的任何API在服务器外部可用?事实并非如此,如果API无法在服务器外部工作,那么您无法对类路径或调试配置进行任何更改。
-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
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;
            }
        }
    }
}