0

我使用以下代码并且它有效:

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 身份验证别名?

4

3 回答 3

0

您唯一的选择(据我所知)是使用用户名/密码配置您的 soap.client.props 并在没有连接/身份验证信息的情况下运行 wsadmin 脚本。在这种情况下,您可以利用 WebSphere 的能力来保护属性文件中的密码。不过,这种情况有两个警告。

  1. 如果您使用 WebSphere 配置文件中的 soap.client.props,任何运行 wsadmin 的人都将使用该用户名/密码。这可能是一个安全问题。尽管您可以通过使用 'wsadmin.sh -p' 选项并在执行时指定一个特殊的 props 文件来解决此问题。
  2. WebSphere 在开箱即用地保护密码方面很糟糕。它只应用一个 XOR,可以很容易地反转。除非您为 WebSphere 编写了自己的自定义加密。
于 2013-07-31T20:17:31.213 回答
0

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

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

于 2013-08-01T21:37:59.123 回答
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);
于 2013-08-08T22:03:52.097 回答