我使用以下代码,它可以工作:
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认证别名?
答案 0 :(得分:0)
您拥有的唯一替代方案(据我所知)将使用用户名/密码配置您的soap.client.props并运行没有连接/身份验证信息的wsadmin脚本。在该场景中,您可以利用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);