要在不访问 WebSphere Application Server 注册表的情况下向调用者部件认证
UsernameToken,您可以替换 UsernameToken 使用者的认证方法,并将调用者配置为使用备用
Java™ 认证和授权服务 (JAAS) 登录配置。
关于此任务
此信息仅适用于 Java API for XML-based RPC (JAX-RPC) Web Service。
缺省情况下,与 Web Service 安全性 UsernameToken
使用者配合使用的缺省 JAAS 登录模块和 UsernameLoginModule 始终根据 WebSphere 注册表验证令牌中包含的用户名和密码。您可以配置定制属性以避免执行此注册表检查。将调用者部件添加到服务提供程序的 WS-Security 约束时,也会始终根据 WebSphere 注册表来验证 UsernameToken 中包含的用户名和密码。此验证在 Java 认证和授权服务 (JAAS) 配置堆栈 system.DEFAULT
中包含的 com.ibm.ws.security.server.lm.ltpaLoginModule 模块中进行,如以下示例所示。
com.ibm.ws.security.server.lm.ltpaLoginModule
com.ibm.ws.security.server.lm.wsMapDefaultInboundLoginModule
WebSphere Application Server WS-Security 运行时不支持为调用者部件使用不包括这两个登录模块的 JAAS 配置。但是,可将您自己的定制登录模块添加到此 JAAS 配置堆栈。
要在不访问 WebSphere Application Server 注册表的情况下将 UsernameToken 与调用者部件配合使用,必须阻止 UsernameLoginModule 和 ltpaLoginModule 模块访问注册表。
注: 使用应用程序开发者中向导向提供者应用程序添加 UsernameToken 时,会自动添加 UsernameToken 的调用者部件。仅当您需要来自 UsernameToken 的标识位于执行线程上时,才需要调用者部件。如果您的应用程序不需要来自 UsernameToken 的标识位于执行线程上,那么不需要调用者部件,可将其移除。调用者部件在部署描述符扩展中配置,且仅可使用应用程序开发者访问。
请参阅 IBM Rational Application Developer 信息中心中的“在使用者安全性约束中配置调用者”主题。
- 要阻止 UsernameLoginModule 模块访问注册表,请将 com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule.disableUserRegistryCheck 定制属性添加到 UsernameToken 使用者的 JAAS 配置。您可以通过以下两种方法之一添加此定制属性:
避免故障: 更新 wssecurity.UsernameToken JAAS
配置会使应用程序服务器上的此 JAAS 配置的所有用户不检查注册表。如果不希望出现此行为,请创建新的 JAAS 配置或使用方法来更新 UsernameToken 使用者
gotcha
要在 wssecurity.UsernameToken JAAS 配置中向 com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule 模块添加定制属性,请执行以下操作:
- 单击安全性 > 全局安全性。
- 在认证下,单击 Java 认证和授权服务 > 系统登录。
- 选择 wssecurity.UsernameToken。
- 选择 com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule.
- 添加以下定制属性:com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule.disableUserRegistryCheck=true。
- 单击确定。
- 重新启动应用程序服务器以重新装入更新的 JAAS 配置。
要将此定制属性添加到应用程序的令牌使用者,请执行以下步骤:
- 单击应用程序 > 应用程序类型 > WebSphere
企业应用程序 >(提供者应用程序名称)> 管理模块 >(模块名称)> Web Service:服务器安全性绑定。
- 在请求使用者(接收方)绑定下,单击编辑定制 > 令牌使用者。
- 选择 UsernameToken 使用者。
- 单击 JAAS 配置 > 属性 > 新建。
- 添加以下定制属性:com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule.disableUserRegistryCheck=true。
- 单击确定。
- 单击保存。
- 重新启动应用程序。
注: 如果 UsernameToken 使用者的名称类似于“Token_123”并且不可选择,那么您用于添加安全性约束的 Application Developer
在部署描述符中向令牌使用者提供名称失败。作为一种替代方法,您可以执行下列两个选项中的一个。
- 将属性添加到安全性 JAAS 配置,如步骤 1 中所述。
- 使用应用程序开发者在应用程序项目中编辑部署描述符绑定。
请参阅 IBM Rational Application Developer 信息中心中的“在使用者安全性约束中配置安全性令牌需求”。
- 开发在 com.ibm.ws.security.server.lm.ltpaLoginModule 上堆叠的 JAAS 登录模块。以下示例显示 JAAS 登录模块的样本代码:
package test.tokens;
import java.util.Map;
import java.util.Hashtable;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import com.ibm.wsspi.wssecurity.auth.token.UsernameToken;
import com.ibm.wsspi.security.token.AttributeNameConstants;
public class MyAuthLoginModule implements LoginModule {
private Map _sharedState = null;
private CallbackHandler _callbackHandler = null;
Subject _subject = null;
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map<String, ?> sharedState, Map<String, ?> options) {
this._sharedState = sharedState;
this._callbackHandler = callbackHandler;
this._subject = subject;
}
public boolean login() throws LoginException {
//For the sake of readability, this login module does not
//protect against all NPE's
String username = null;
char [] password = null;
NameCallback nameCallback = null;
PasswordCallback passwordCallback = null;
//Get the username and password from callbacks that
//the ws-security runtime set up
Callback[] callbacks = new Callback[2];
callbacks[0] = nameCallback = new NameCallback("Username: ");
callbacks[1] = passwordCallback = new PasswordCallback("Password: ", false);
try {
_callbackHandler.handle(callbacks);
} catch ( Exception e ) {
throw new LoginException("Unable to process callbacks");
}
if (nameCallback != null) {
username = nameCallback.getName();
}
if (passwordCallback != null) {
char tmp[] = passwordCallback.getPassword();
if (tmp != null && tmp.length != 0) {
password = new char[tmp.length];
System.arraycopy(tmp, 0, password, 0, tmp.length);
}
}
if (username == null) {
throw new LoginException("Unable to obtain username");
}
//If you will be validating the username and password,
//validate it here
Hashtable customProperties = (Hashtable)_sharedState.get(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY);
if (customProperties == null) {
customProperties = new Hashtable();
_sharedState.put(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY, customProperties);
}
// Default realm is used here, but any trusted realm can be used
String uid = "defaultWIMFileBasedRealm/" + username;
customProperties.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, uid)
// SECURITYNAME will be the principal name
customproperties.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, username);
return true;
}
public boolean logout() throws LoginException {
return false;
}
}
- 创建 JAAS 登录配置。
- 在管理控制台中,选择安全性>全局安全性。
- 在“认证”下,选择 Java 认证和授权服务 > 系统登录。
- 单击新建,然后在别名下输入 test.auth.jaxrpcunt。
- 添加 JAAS 登录模块。必须按所示顺序添加以下登录模块:
test.tokens.MyAuthLoginModule
注: 此模块的名称必须与您开发的 JAAS 登录模块匹配。
com.ibm.ws.security.server.lm.ltpaLoginModule
com.ibm.ws.security.server.lm.wsMapDefaultInboundLoginModule
对于每个登录模块:
- 在 JAAS 登录模块下,单击新建。
- 在模块类名下,输入登录模块的名称。
- 仅针对 test.tokens.MyAuthLoginModule,选择使用登录模块代理。
- 单击确定。
- 单击确定,然后单击保存。
- 重新启动应用程序服务器以应用 JAAS 配置更改。
- 配置调用者部件以使用新的 JAAS 配置。您可仅使用应用程序开发者来配置调用者部件。 请参阅 IBM Rational Application Developer 信息中心中的“在使用者安全性约束中配置调用者”主题。
- 将以下定制属性添加到 UsernameToken 的调用者部件:com.ibm.wsspi.wssecurity.Caller.assertionLoginConfig=system.test.auth.jaxrpcunt。
- 保存部署描述符
- 将应用程序重新部署到服务器
- 测试服务。