我有一个 EJB,它使用 HTTP(REST api)调用单元中的另一台服务器。
在 EJB 上下文中,用户已经过身份验证和授权,如何将安全令牌传播到其他服务器,避免在请求中提供凭据?
可以从安全性获取 WebSphere 的Ltpa
令牌subject
并将其作为cookie
HTTP 调用的 a 传递:
public static SingleSignonToken getSSOTokenFromSubject(final Subject subject) {
if (subject == null) {
return null;
}
return AccessController.doPrivileged(new PrivilegedAction<SingleSignonToken>() {
public SingleSignonToken run() {
Set<SingleSignonToken> ssoTokens = subject.getPrivateCredentials(SingleSignonToken.class);
for (SingleSignonToken ssoToken : ssoTokens) {
if (ssoToken.getName().equals("LtpaToken")) {
return ssoToken;
}
}
return null;
}
});
}
// Get cookie to add to outgoing HTTP requests
SingleSignonToken ssoToken = getSSOTokenFromSubject(subject);
String ssoTokenStr = null;
if (ssoToken != null) {
byte[] ssoTokenBytes = ssoToken.getBytes();
ssoTokenStr = com.ibm.ws.util.Base64.encode(ssoTokenBytes);
}
String ssoTokenCookie = "LtpaToken2=" + ssoTokenStr;
通过向ssoTokenCookie
请求 cookie 添加 ,无需提供用户凭据。
Cookie ltpaCookie = WebSecurityHelper.getSSOCookieFromSSOToken();
从当前线程的主题中提取 SSO 令牌并从中构建 SSO cookie 以用于下游 Web 调用。基本上下面帖子中的整个代码是做什么的。我相信可以从 WAS 8.x 访问此方法。
需要以下 Jar 作为编译参考:com.ibm.ws.admin.client-8.5.0.jar
(我在此示例中使用 WAS 8.5.5.11)