如何在不使用用户名或密码的情况下获取AdminClient Websphere对象?

时间:2013-07-31 18:22:48

标签: java websphere

我使用以下代码,它可以工作:

Properties props = new Properties();
props.setProperty(AdminClient.CONNECTOR_HOST, "localhost");
props.setProperty(AdminClient.CONNECTOR_PORT, port); //2809
props.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_RMI);
props.setProperty(AdminClient.CONNECTOR_SECURITY_ENABLED, "true");
props.setProperty(AdminClient.USERNAME, user);
props.setProperty(AdminClient.PASSWORD, password);
adminClient = AdminClientFactory.createAdminClient(props);

但我想找到一种不使用用户名或密码的方法,有没有人知道如何实现这一目标?也许这里可以使用WAS的J2C认证别名?

3 个答案:

答案 0 :(得分:0)

您拥有的唯一替代方案(据我所知)将使用用户名/密码配置您的soap.client.props并运行没有连接/身份验证信息的wsadmin脚本。在该场景中,您可以利用WebSphere的功能来保护属性文件中的密码。但是,这种情况有两点需要注意。

  1. 如果您在WebSphere配置文件中使用soap.client.props,那么运行wsadmin的任何人都将利用该用户名/密码。这可能是一个安全问题。虽然你可以通过使用'wsadmin.sh -p'选项并在执行时指定一个特殊的道具文件来解决这个问题。
  2. WebSphere很擅长保护开箱即用的密码。它只应用XOR,可以很容易地反转。除非您为WebSphere编写了自己的自定义加密。

答案 1 :(得分:0)

AdminClient使用当前的run-as主题(由getRunAsSubject中的静态setRunAsSubject / WSSubject方法确定)。如果在创建AdminClient期间提供用户和密码,那么WebSphere实际执行登录并更改当前线程上的run-as主题。

我希望(要测试)如果已经有一个run-as用户,并且在创建AdminClient时没有提供用户/密码,那么WebSphere使用当前的run-as主题。如果这是正确的,那么在servlet或EJB上使用@RunAs注释并将相应的角色映射到管理控制台中所需的用户就足够了。

答案 2 :(得分:0)

是的,可以使用J2C身份验证别名,请查看以下代码段

import com.ibm.wsspi.security.auth.callback.Constants;
import com.ibm.wsspi.security.auth.callback.WSMappingCallbackHandlerFactory;
import javax.resource.spi.security.PasswordCredential;
import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
...
Map map = new HashMap();
map.put(Constants.MAPPING_ALIAS, YOUR_J2C_AUTHENTICATION_ALIAS);
CallbackHandler callbackHandler = null;
try {
    callbackHandler = WSMappingCallbackHandlerFactory.getInstance().getCallbackHandler(map, null);
} catch (NotImplementedException e) {
    logger.error(e);
    return;
}
LoginContext loginContext;
try {
    loginContext = new LoginContext("DefaultPrincipalMapping", callbackHandler);
} catch (LoginException e) {
logger.error(e);
return;
}
try {
    loginContext.login();
} catch (LoginException e) {
    logger.error(e);
    return;
}
Subject subject = loginContext.getSubject();
Set credentials = subject.getPrivateCredentials();
PasswordCredential passwordCredential = (PasswordCredential) credentials.iterator().next();
Properties props = new Properties();
props.setProperty(AdminClient.CONNECTOR_HOST, "localhost");
props.setProperty(AdminClient.CONNECTOR_PORT, port); //2809
props.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_RMI);
props.setProperty(AdminClient.CONNECTOR_SECURITY_ENABLED, "true");
props.setProperty(AdminClient.USERNAME, passwordCredential.getUserName());
props.setProperty(AdminClient.PASSWORD, new String(passwordCredential.getPassword()));
adminClient = AdminClientFactory.createAdminClient(props);