我有一个EJB,它使用HTTP(REST api)调用单元中的另一个服务器。
在EJB上下文中,用户已经过身份验证和授权,如何将安全令牌传播到其他服务器,从而避免在请求中提供凭据?
答案 0 :(得分:2)
可以从安全性Ltpa
获取WebSphere的subject
令牌,并将其作为cookie
传递给HTTP调用:
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,无需提供用户凭据。
答案 1 :(得分:0)
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)